こんにちは!今日で、 OOPの原理に関する一連の講義が終了します。このレッスンではポリモーフィズムについて説明します。 ポリモーフィズムは、複数の型を同じ型であるかのように扱う機能です。この場合、オブジェクトの動作は、オブジェクトがどの型に属しているかによって異なります。 この声明をさらに詳しく見てみましょう。最初の部分、「複数のタイプを同じタイプであるかのように扱う機能」から始めましょう。異なるタイプがどのようにして同一であることができるのでしょうか? 少し奇妙に聞こえます :/ それは実際には単純です。たとえば、この状況は継承を通常に使用する場合に発生します。どのように機能するかを見てみましょう。
この「一般化」が必要なく、逆に種の動作が異なることが必要な場合、各タイプは異なる動作をします。ポリモーフィズムのおかげで、さまざまなクラスに対して単一のインターフェイス (メソッドのセット) を作成できます。このため、プログラムの複雑さが軽減されます。たとえプログラムを 40 種類の猫に拡張したとしても、40 匹すべての猫に対して 1 つのメソッドという最も単純なインターフェイスが得られます
Cat
単一のメソッドrun()
「run」 を持つ単純な親クラスがあるとします。
public class Cat {
public void run() {
System.out.println("Бег!");
}
}
Cat
次に、ライオンLion
、トラ、チーターを表す、 、 Tiger
、 を継承する 3 つのクラスを作成しましょう。Cheetah
public class Lion extends Cat {
@Override
public void run() {
System.out.println("Лев бежит со speedю 80 км/ч");
}
}
public class Tiger extends Cat {
@Override
public void run() {
System.out.println("Тигр бежит со speedю 60 км/ч");
}
}
public class Cheetah extends Cat {
@Override
public void run() {
System.out.println("Гепард бежит со speedю до 120 км/ч");
}
}
したがって、クラスは 3 つあります。同じクラスであるかのように一緒に仕事ができる状況をシミュレーションしてみましょう。うちの猫の一匹が病気で、アイボリット博士の助けが必要だと想像してみましょう。Aibolit
ライオン、トラ、チーターを扱うことができる クラスを作成してみましょう。
public class Aibolit {
public void healLion(Lion lion) {
System.out.println("Лев здоров!");
}
public void healTiger(Tiger tiger) {
System.out.println("Тигр здоров!");
}
public void healCheetah(Cheetah cheetah) {
System.out.println("Гепард здоров!");
}
}
問題は解決されたように見えます。クラスが作成され、使用できるようになりました。しかし、プログラムを拡張したい場合はどうすればよいでしょうか? 現在、生息しているのはライオン、トラ、チーターの 3 種だけです。しかし、世界には40種以上の猫がいます。プログラムにパラスの猫、ジャガー、メインクーン、飼い猫、その他すべての猫のための別々のクラスを追加したらどうなるかを想像してみてください。 もちろんプログラム自体は機能しますが、クラスはAibolit
それぞれの種類の猫を治療するための新しい方法を常に追加する必要があり、その結果、クラスは前例のない規模に成長することになります。ここで、ポリモーフィズムの特性、つまり「複数の型を同じ型であるかのように操作できる機能」が登場します。同じこと、つまり猫を治療するためのメソッドを無数に作成する必要はありません。1 つの方法ですべてのケースを一度に処理できます。
public class Aibolit {
public void healCat(Cat cat) {
System.out.println("Пациент здоров!");
}
}
オブジェクトとオブジェクトの両方を メソッドにhealCat()
渡すことができます。それらはすべて次のとおりです。 Lion
Tiger
Cheetah
Cat
public class Main {
public static void main(String[] args) {
Aibolit aibolit = new Aibolit();
Lion simba = new Lion();
Tiger sherekhan = new Tiger();
Cheetah chester = new Cheetah();
aibolit.healCat(simba);
aibolit.healCat(sherekhan);
aibolit.healCat(chester);
}
}
コンソール出力:
Пациент здоров!
Пациент здоров!
Пациент здоров!
このようにして、私たちのクラスはАйболит
異なる型を同じ型であるかのように処理できるようになります。次に、2 番目の部分を扱います。「この場合、オブジェクトの動作は、オブジェクトがどの型に属しているかによって異なります。」ここでもすべてがシンプルです。自然界では、すべての猫の走り方が異なります。少なくとも、走行速度が異なります。私たちの 3 匹のペットの中で、チーターは最も足が速く、トラとライオンはゆっくりと走ります。つまり、彼らの行動は異なります。ポリモーフィズムは、異なる型を 1 つの型として使用できるようにするだけではありません。同時に、それらの違いを忘れずに、それぞれに特有の動作を保存することができます。これはこの例で理解できます。猫たちが無事回復した後、お祝いのために少し走り回ることにしたとします。これをクラスに追加しましょうAibolit
。
public class Aibolit {
public void healCat(Cat cat) {
System.out.println("Пациент здоров!");
cat.run();
}
}
同じコードを実行して 3 匹の動物を処理してみましょう。
public static void main(String[] args) {
Aibolit aibolit = new Aibolit();
Lion simba = new Lion();
Tiger sherekhan = new Tiger();
Cheetah chester = new Cheetah();
aibolit.healCat(simba);
aibolit.healCat(sherekhan);
aibolit.healCat(chester);
}
そして、結果は次のようになります。
Пациент здоров!
Лев бежит со speedю 80 км/ч
Пациент здоров!
Тигр бежит со speedю 60 км/ч
Пациент здоров!
Гепард бежит со speedю до 120 км/ч
ここでは、3 匹の動物すべてをメソッドに渡し、それぞれを に「一般化」したにもかかわらず、オブジェクトの特定の動作が保存されていることがはっきりとわかりますCat
。ポリモーフィズムのおかげで、Java はこれらが単なる 3 匹の猫ではなく、ライオン、トラ、チーターであり、それぞれ異なる動きをすることを完全に記憶します。これがポリモーフィズムの柔軟性を使用する主な利点です。多くの種類に共通する機能を作成する必要がある場合、ライオン、トラ、チーターは単に「猫」に変わります。すべての動物は異なりますが、場合によっては、どの種に属していても、猫は猫です :) こちらのビデオで確認してください。
run()
。
GO TO FULL VERSION