こんにちは!今日は、オブジェクト指向プログラミング (OOP) のもう 1 つの原則である継承について詳しく見ていきます。同時に、クラス間の他のタイプの関係、つまり構成と集約についても学習します。このトピックは難しいものではありません。継承とその例はこれまでの講義ですでに何度も取り上げています。今日の主なことは、知識を統合し、継承のメカニズムを詳しく見て、もう一度例を確認することです :) それでは、いきましょう!
Java の継承とその利点
おそらく覚えていると思いますが、継承は、既存の (親) クラスに基づいて新しいクラスを記述することを可能にするメカニズムです。この場合、親クラスのプロパティと機能が新しいクラスに借用されます。以前の講義での継承の例を思い出してください。public class Car {
private String model;
private int maxSpeed;
private int yearOfManufacture;
public Car(String model, int maxSpeed, int yearOfManufacture) {
this.model = model;
this.maxSpeed = maxSpeed;
this.yearOfManufacture = yearOfManufacture;
}
public void gas() {
//...gas
}
public void brake() {
//...brake
}
}
public class Truck extends Car {
public Truck(String model, int maxSpeed, int yearOfManufacture) {
super(model, maxSpeed, yearOfManufacture);
}
}
public class Sedan extends Car {
public Sedan(String model, int maxSpeed, int yearOfManufacture) {
super(model, maxSpeed, yearOfManufacture);
}
}
私たちはさまざまなタイプの車に取り組む特定のプログラムがあります。あなたが車の愛好家でなくても、おそらく世界中にこれらの同じ車の非常に多くの種類があることをご存知でしょう :) したがって、車の一般的なプロパティを共通の親クラスに分離しますCar
。種類に関係なく、すべての車に共通するものは何ですか? どの車にも製造年、モデル名、最高速度があります。これらのプロパティをフィールドmodel
、 、maxSpeed
に入力しますyearOfManufacture
。動作に関しては、どの車でも加速したりブレーキをかけたりできます:) この動作はメソッドgas()
とで定義しますbrake()
。これは私たちにどのようなメリットをもたらしますか? まずはコード量を減らすことです。もちろん、親クラスがなくてもできます。gas()
ただし、すべての車は加速と制動ができる必要があるため、クラスbrake()
、Truck
クラスSedan
、 クラスF1Car
、 クラス、Sportcar
およびその他すべての車のクラスにメソッドを作成する必要があります。この場合、どれだけの追加コードを記述することになるか想像してみてください。モデル、maxSpeed、および yearOfManufacture フィールドを忘れないでください。親クラスを放棄した場合、それらは各マシン クラスに作成されます。 数十のマシンクラスがある場合、反復コードの量は非常に多くなります。共通のフィールドとメソッド (「状態」や「動作」とも呼ばれます) を親クラスに移動すると、時間とスペースを大幅に節約できます。特定のタイプに、そのタイプにのみ固有で、他のタイプのマシンには存在しないプロパティやメソッドがあるとしても、それは問題ではありません。これらは、他のクラスとは別に、いつでも子孫クラス内に作成できます。
public class F1Car extends Car {
public void pitStop() {
//...only racing cars make pit stops
}
public static void main(String[] args) {
F1Car formula1Car = new F1Car();
formula1Car.gas();
formula1Car.pitStop();
formula1Car.brake();
}
}
F1 レーシングカーの場合を考えてみましょう。彼らの「親戚」とは異なり、彼らは独特の行動をしており、時々ピットストップのために止まります。これは私たちには問題ありません。親クラスの一般的な動作についてはすでに説明しましたCar
が、クラス内に子孫クラスの特定の動作を追加できます。 これはフィールドにも当てはまります。子クラスに一意のプロパティがある場合、その中でこれらのフィールドを静かに宣言することができ、心配する必要はありません :)コードを再利用できることは、継承の主な利点です。 プログラマにとって、不必要な量のコードを書かないことは非常に重要です。仕事をしていると何度もこのようなことに遭遇するでしょう。もう 1 つ重要なことを覚えておいてください。Javaには多重継承がありません。各クラスは 1 つのクラスのみを継承します。この理由については今後の講義で詳しく説明しますが、ここでは覚えておいてください。ちなみに、これが Java を他の OOP 言語と区別するものです。たとえば、C++ には多重継承があります。継承に関してはすべてが多かれ少なかれ明らかです。次に進みましょう。
構成と集約
クラスとオブジェクトは相互に関連付けることができます。継承は関係「である」(英語では「IS A」) を表します。レオは動物です。Animal
この関係は、クラスが親となり、Lion
クラスが子となる継承を使用して簡単に表現できます。ただし、世界のすべての関係がこのように説明されるわけではありません。たとえば、キーボードは間違いなく何らかの方法でコンピュータに接続されていますが、それはコンピュータではありません。手は何らかの形で人とつながっていますが、手は人ではありません。このような場合、それは別のタイプの関係、つまり「である」ではなく「一部である」(「HAS A」) に基づいています。手は人間ではありませんが、人間の一部です。キーボードはコンピューターではありませんが、コンピューターの一部です。HAS A 関係は、構成メカニズムと集計メカニズムを使用してコードで記述することができます。それらの違いは、これらの接続の「厳密さ」にあります。簡単な例を挙げてみましょう。私たちはCar
車を持っています。どの車にもエンジンが付いています。さらに、どの車両にも乗客が乗車しています。Engine engine
フィールドと?の基本的な違いは何ですかPassenger [] passengers
? 車に乗客が乗っていても、それА
は乗客が乗れないという意味ではありません。1台の車両に数人の乗客が乗車できます。さらに、乗客全員が車両から降ろされても、車両は静かに機能し続けます。クラスと乗客数の関係はそれほど厳密ではありません。それは集約と呼ばれます。このトピックに関する優れた記事があります:クラス (オブジェクト) 間の関係。これは、集計のもう 1 つの良い例です。学生を表すクラスとクラス(学生のグループ) があるとします。学生は、物理学クラブ、スター・ウォーズ学生ファンクラブ、または KVN チームのメンバーになることができます。 構成は、より厳密なタイプのコミュニケーションです。合成を使用する場合、オブジェクトはオブジェクトの一部であるだけでなく、同じタイプの別のオブジェクトに属することはできません。最も単純な例は車のエンジンです。エンジンは車の一部ですが、別の車の一部にすることはできません。ご覧のとおり、それらの接続はとの接続よりもはるかに厳密です。 B
C
Car
Passenger [] passengers
Student
StudentsGroup
Car
Passengers
GO TO FULL VERSION