根据标准定义,对象是包含数据和行为的实体。根据我的理解,数据是从外部发送的。例如,我们有一个计算数字平方的类。我们创建一个实例并将消息与数字一起发送到对象以计算平方。我们不是从外部发送数据吗?为什么所有定义都声明对象包含数据?谢谢
4 回答
在这种情况下,数据是对象的状态。定义说对象的状态/数据应该在内部存储。例如,考虑以下类:
class Math {
Double square(double x) {
return x * x;
}
// other similar functions
}
作为一种语言结构,它是一个类。但是,它不是面向对象意义上的真正类。因为它没有状态或数据。它只是一个包装在类结构中的函数。这不一定是错的。因为在这种情况下,碰巧您有不需要状态的操作。
该定义试图强调的是:您拥有一个真实的对象,当它(或它的类)同时具有数据和行为时。并非类构造的每次使用都代表一个真正的对象。
因此,如果代表它的类满足以下三个条件,则您有一个对象。
- 该类有状态/日期。如果没有,那么它只是一堆功能。它不是面向对象的,它是过程的。
- 该类具有行为。如果不是,那么它只是一个容器,一堆变量(C 中的结构)。
- 不仅类具有状态/数据和行为/方法,而且数据和行为之间存在内在关系。这意味着仅仅将一些变量和函数放在一起并不能成为一个真正的对象。例如,如果您有状态/数据并且在类中也有一些方法,但如果该函数不需要对任何状态进行操作,那么该方法是否真的属于该类存在疑问。
下面是一个简单的例子,我认为是一个适当的类(对象的表示)。
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
}
}
在这里,我们看到类既有状态又有行为。我们还看到状态和行为都真正属于这个类。它们是患者概念的属性。我们进一步看到,操作与数据有着内在的关系。如果不咨询/使用其状态,您无法确定患者是否健康。
我认为问题在于您的示例与面向对象的设计非常不匹配。我只是说计算一个数字的平方是一个无记忆的函数,因此显然没有理由将数据存储在对象属性中。但是,当您必须处理有状态实体的管理时,您将更容易地了解类和面向对象的重要性。
您的示例是一个私有案例,其中对象不需要保存数据(即状态)。在这种情况下,它可以用一个函数替换(只是行为)。大多数对象都需要存储数据。例如,对象 Person 应该包含描述该人的品质,而不仅仅是可能的行为。
对象是类的一个实例。
类 (a, a*a) 是方形类,但 (2, 4) 是它的一个实例(对象)。是的,数据被发送到类并创建新对象。