OOP(面向对象编程), 对象概念

4
根据标准定义,对象是包含数据和行为的实体。根据我的理解,数据是从外部发送的。例如,我们有一个计算数字平方的类。我们创建一个实例并向对象发送消息以及数字来计算平方。难道我们不是从外部发送数据吗?为什么所有的定义都说对象包含数据?

是的,我们将输入放入对象中,但对象包含两者。 - Grijesh Chauhan
1
一个对象可以同时包含两者,但不一定需要这样做。例如,我们有一个文件对象。我们可以使用文件名调用File::Open方法,如myfile->Open("SomeFile.txt");此时,文件对象可能会尝试打开文件,并在内部跟踪某种文件指针,可能是文件名等。因此,现在它有了数据,可能是文件大小,如myfile->FileSize或文件位置,如myfile->FilePosition。然后,您可以调用更多函数、"行为",例如myfile->Closemyfile->Read等。 - Mark Ormston
对象可以由纯数据或纯行为组成,也可以同时包含两者。这是您的选择。添加字段并保持状态。添加方法并实现您的行为。面向对象范式仅表示它可以同时包含两者。 - Alex
4个回答

3

在这个上下文中,数据是指对象的状态。定义说,对象的状态/数据应该被内部存储。例如,考虑以下类:

class Math {

  Double square(double x) {
      return x * x;
  }
  // other similar functions
}

作为一种语言构造,它是一个类。但是,它在面向对象的意义上并不是真正的类,因为它没有状态或数据。它只是一个包装在类结构中的函数。这并不一定是错误的。因为在这种情况下,你有一些不需要状态的操作。
该定义试图强调的是:当对象(或其类)具有数据和行为时,您才拥有一个真正的对象。并非每个类构造的使用都代表一个真正的对象。
因此,如果表示它的类满足以下三个条件,则您拥有一个对象。
1. 类具有状态/数据。否则,它只是一堆函数。这不是面向对象的,而是过程式的。 2. 类具有行为/方法。否则,它只是一个容器,一堆变量(C中的结构体)。 3. 不仅类具有状态/数据和行为/方法,而且数据和行为之间存在内在关系。这意味着仅仅把一些变量和函数组合在一起并不能产生真正的对象。例如,如果您拥有状态/数据,并且您还在类中拥有某些方法,但是如果该函数不需要对任何状态进行操作,那么问题就在于该方法是否真正属于该类。
以下是我认为是适当的类(对象表示)的简单示例。
Class Patient {
      // blood pressure
     double systolic;
     double diastolic;
     double weight;
      int age;
     public Patient(double systolic,   double diastolic,  double weight, int age){

    }

   Public boolean isHealthy(){
        // do some calculations and algorithms on age, weight and blood pressure indicators.
        // return result as true of false
  }

}

在这里,我们看到类既有状态也有行为。我们还看到状态和行为都属于这个类。它们是概念“病人”的属性。此外,我们还看到操作与数据有固有关系。你不能在未查看/使用其状态的情况下确定病人是否健康。


1
我认为问题出在你的示例上,它与面向对象设计非常不匹配。我的意思只是计算一个数字的平方是一种无记忆函数,因此显然没有必要将数据存储在对象属性中。但是,当你需要处理有状态实体的管理时,你会更容易地理解类和面向对象的重要性。

0

你的例子是一个特殊情况,在这种情况下,对象不需要保存数据(即状态)。在这种情况下,它可以被一个函数替换(只保留行为)。大多数对象需要存储数据。例如,一个人的对象应该包含描述这个人的特征,而不仅仅是可能的行为。


0

对象是类的一个实例。

Class(a,a * a)是正方形类,但(2,4)是它的一个实例(对象)。是的,数据被发送到类中并创建新对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接