標準的な定義によれば、オブジェクトはデータと動作の両方を含むエンティティです。私の理解によると、データは外部から送信されます。たとえば、数値の二乗を計算するクラスがあります。インスタンスを作成し、数値とともにメッセージをオブジェクトに送信して二乗を計算します。外部からデータを送信していませんか?すべての定義で、オブジェクトにデータが含まれていると記載されているのはなぜですか? ありがとう
4 に答える
このコンテキストでは、データはオブジェクトの状態です。定義は、オブジェクトの状態/データを内部的に保存する必要があることを示しています。たとえば、次のクラスを考えてみます。
class Math {
Double square(double x) {
return x * x;
}
// other similar functions
}
言語構造としては、クラスです。ただし、オブジェクト指向の意味での真のクラスではありません。状態やデータがないためです。これは、クラス コンストラクトにラップされた単なる関数です。これは必ずしも間違っているわけではありません。この場合、状態を必要としない操作が発生するためです。
定義が強調しようとしているのは、それ(またはクラス)がデータと動作の両方を持っている場合、実際のオブジェクトがあるということです。クラス コンストラクトのすべての使用法が真のオブジェクトを表すわけではありません。
したがって、それを表すクラスが次の 3 つの条件を満たしている場合、オブジェクトを持っていることになります。
- クラスには状態/日付があります。そうでない場合は、単なる関数の集まりです。オブジェクト指向ではなく、手続き型です。
- クラスには動作があります。そうでない場合、それは単なるコンテナーであり、一連の変数 (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
}
}
ここで、クラスには状態と動作の両方があることがわかります。また、状態と動作の両方が実際にこのクラスに属していることもわかります。それらは患者の概念の特性です。さらに、操作にはデータとの本質的な関係があることがわかります。患者の状態を相談/使用せずに、患者が健康であるかどうかを判断することはできません。
問題は、オブジェクト指向の設計にうまく適合しない例にあると思います。数値の 2 乗の計算はメモリのない関数であるため、オブジェクト プロパティ内にデータを格納する理由がないことは明らかです。ただし、ステートフル エンティティの管理に対処する必要がある場合は、一般的に、クラスとオブジェクト指向の重要性をより簡単に理解できます。
オブジェクトはクラスのインスタンスです。
クラス (a, a*a) は正方クラスですが、(2, 4) はそのインスタンス (オブジェクト) です。はい、データがクラスに送信され、新しいオブジェクトが作成されます。
あなたの例は、オブジェクトがデータ(つまり状態)を保持する必要がないプライベートケースです。この場合、関数 (動作のみ) に置き換えることができます。ほとんどのオブジェクトはデータを保存する必要があります。たとえば、オブジェクト Person には、可能な行動だけでなく、その人を説明する性質が含まれている必要があります。