やあ!今日は、オブジェクト指向プログラミング (OOP) の原則の 1 つである継承について詳しく見ていきます。また、クラス間の他のタイプの関係、つまり構成と集計についても学習します。
このトピックは難しいものではありません。あなたはすでに過去のレッスンで継承と継承の例に何度も遭遇しています。今日の主な目的は、知識を強化し、継承のメカニズムをより詳細に検討し、いくつかの例をもう一度実行することです。:) さて、行きましょう!
車のクラスが数十個あると、重複コードの量が非常に多くなります。共通のフィールドとメソッド (「状態」や「動作」とも呼ばれます) を親クラスに移動すると、時間とスペースを大幅に節約できます。一部の車種に、他の車種にはない独自のプロパティやメソッドがあったとしても、問題はありません。これらは、他のクラスとは別に、いつでも子孫クラス内に作成できます。
フィールドについても同様です。子クラスに固有のプロパティがある場合は、子クラス内でこれらのフィールドを冷静に宣言し、心配するのをやめます。:)コードを再利用できることが継承の主な利点です。 プログラマーにとって、余分なコードを書かないことは非常に重要です。仕事をしていると、このようなことが何度も出てきます。もう 1 つ重要なことを覚えておいてください。Javaには多重継承がありません。。各クラスは 1 つのクラスだけを継承します。この理由については、今後のレッスンで詳しく説明します。とりあえず、これだけは覚えておいてください。ちなみに、これにより Java は他の OOP 言語とは異なります。たとえば、C++ は多重継承をサポートしています。継承に関しては、すべてが多かれ少なかれ明らかです。次へ移りましょう。

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
SportsCar
model
maxSpeed
yearOfManufacture

public class F1Car extends Car {
public void pitStop() {
// Only race cars make pit stops
}
public static void main(String[] args) {
F1Car formula1Car = new F1Car();
formula1Car.gas();
formula1Car.pitStop();
formula1Car.brake();
}
}
例として F1 レースカーを見てみましょう。彼らの「親戚」とは異なり、彼らは独特の行動をしており、時々ピットストップします。これは私たちには問題ありません。親クラスの一般的な動作についてはすでに説明しましたがCar
、子孫クラスの特定の動作をそれらのクラスに追加できます。 
構成と集計
クラスとオブジェクトは相互にリンクできます。継承は「is-a」関係を表します。ライオンは動物です。このような関係は、継承を使用して簡単に表現できます。ここで、Animal
は親クラス、Lion
は子クラスです。ただし、すべての関係がこのように説明されるわけではありません。たとえば、キーボードは間違いなくコンピュータに関連していますが、コンピュータではありません。手は何らかの形で人と関係がありますが、人ではありません。このような場合、別のタイプの関係、つまり「is-a」ではなく「has-a」になります。手は人間ではありませんが、人間の一部です。キーボードはコンピューターではありませんが、コンピューターの一部です。has-a 関係は、合成と集計を使用してコードで記述できます。。違いは関係の「厳しさ」にあります。簡単な例を挙げてみましょう。Car
クラスがあります。どの車にもエンジンが付いています。さらに、どの車両にも乗客がいます。Engine engine
とフィールドの基本的な違いは何ですかPassenger[] passengers
? A
乗客が車に座っているという事実は、乗客B
がC
車に乗っていないことを意味するわけではありません。自動車は複数の乗客に対応できます。さらに、乗客全員が車から降りても、車はスムーズに機能します。Car
クラスと配列の関係はPassenger[] passengers
それほど厳密ではありません。それは集約と呼ばれます。これは、集計のもう 1 つの良い例です。クラスStudent
とStudentGroup
クラス。学生は、物理クラブ、スター・ウォーズ ファン クラブ、学生コメディ クラブなど、複数の学生組織に参加できます。 構成は、より厳密な種類の関係です。合成を使用する場合、オブジェクトはあるオブジェクトの一部であり、同じタイプの別のオブジェクトに属することはできません。最も単純な例は車のエンジンです。エンジンは車の一部であり、他の車の一部になることはできません。ご覧のとおり、それらの関係はCar
との関係よりもはるかに厳密ですPassengers
。 
さらに読む: |
---|
GO TO FULL VERSION