やあ!今日で、OOP の原則に関する一連のレッスンを終了します。このレッスンでは、Java ポリモーフィズムについて説明します。ポリモーフィズムは、複数の型を同じ型であるかのように操作できる機能です。また、オブジェクトの動作はその種類によって異なります。この声明を詳しく見てみましょう。最初の部分から始めましょう。「複数のタイプを同じタイプであるかのように扱う能力」です。異なるタイプがどのようにして同じになるのでしょうか? 少し奇妙に聞こえます :/ポリモーフィズムの使い方 - 1実際、すべては非常に単純です。たとえば、この状況は通常の継承の使用中に発生します。それがどのように機能するかを見てみましょう。単一のrun()メソッドを持つ単純なCat親クラスがあるとします。

public class Cat {

   public void run() {
       System.out.println("Run!");
   }
}
ここで、 Catを継承する 3 つのクラス、LionTigerCheetah を作成します。

public class Lion extends Cat {

   @Override
   public void run() {
       System.out.println("Lion runs at 80 km/h");
   }
}

public class Tiger extends Cat {

   @Override
   public void run() {
       System.out.println("Tiger runs at 60 km/h");
   }
}

public class Cheetah extends Cat {

   @Override
   public void run() {
       System.out.println("Cheetah runs at up to 120 km/h");
   }
}
したがって、クラスは 3 つあります。同じクラスであるかのように彼らと協力できる状況をモデル化してみましょう。我が家の猫が病気でドリトル先生の助けが必要だと想像してみてください。ライオン、トラ、チーターを癒すことができる ドリトルのクラスを作成してみましょう。

public class Dolittle {

   public void healLion(Lion lion) {

       System.out.println("Lion is healthy!");
   }

   public void healTiger(Tiger tiger) {

       System.out.println("Tiger is healthy!");
   }

   public void healCheetah(Cheetah cheetah) {

       System.out.println("Cheetah is healthy!");
   }
}
問題は解決されたようです。クラスが作成され、準備が整いました。しかし、プログラムを拡張したい場合はどうすればよいでしょうか? 現在はライオン、トラ、チーターの3種類のみです。しかし、世界には40種類以上の猫がいます。マヌルネコ、ジャガー、メインクーン、飼い猫、その他すべてに個別のクラスを追加したらどうなるかを想像してみてください。 ポリモーフィズムの使い方 - 2もちろんプログラム自体は機能しますが、各種類の猫を癒すためにドリトルクラスに新しいメソッドを常に追加する必要があります。その結果、それは前例のない規模に成長するでしょう。ここで、ポリモーフィズム、つまり「複数のタイプを同じタイプであるかのように操作できる機能」が登場します。猫を癒すという同じことを行うために、無数のメソッドを作成する必要はありません。これらすべてに 1 つの方法で十分です。

public class Dolittle {

   public void healCat(Cat cat) {

       System.out.println("The patient is healthy!");
   }
}
heelCat ()メソッドは、LionTiger、およびCheetahオブジェクトを受け入れることができます。これらはすべてCatのインスタンスです。

public class Main {

   public static void main(String[] args) {

       Dolittle dolittle = new Dolittle();

       Lion simba = new Lion();
       Tiger shereKhan = new Tiger();
       Cheetah chester = new Cheetah();

       dolittle.healCat(simba);
       dolittle.healCat(shereKhan);
       dolittle.healCat(chester);
   }
}
コンソール出力: 患者は健康です! 患者さんは元気ですよ!患者さんは元気ですよ! それで、私たちのドリトルクラスは、異なる型を同じ型であるかのように処理します。次に、2 番目の部分「さらに、オブジェクトの動作はその種類に応じて異なります」に取り組んでみましょう。すべてとてもシンプルです。自然界では、猫はそれぞれ異なる走り方をします。少なくとも、異なる速度で実行されます。私たちの3匹のネコ科動物の中で、チーターは最も速く走りますが、トラとライオンはよりゆっくりと走ります。言い換えれば、彼らの行動は異なります。ポリモーフィズムは、単に異なる型を 1 つの型として使用できるようにするだけではありません。また、それぞれの違いを覚えて、それぞれに特有の動作を保存することもできます。次の例はこれを示しています。我が家の猫が回復に成功した後、少しランニングを楽しむことにしたとします。これをDolittleクラスに追加します。

public class Dolittle {

   public void healCat(Cat cat) {

       System.out.println("The patient is healthy!");
       cat.run();
   }
}
同じコードを実行して 3 匹の動物を処理してみましょう。

public static void main(String[] args) {

   Dolittle dolittle = new Dolittle();

   Lion simba = new Lion();
   Tiger shereKhan = new Tiger();
   Cheetah chester = new Cheetah();

   dolittle.healCat(simba);
   dolittle.healCat(shereKhan);
   dolittle.healCat(chester);
}
結果は次のようになります。 患者は健康です。ライオンは時速80kmで走ります。患者さんは元気ですよ!タイガーは時速60kmで走ります。患者さんは元気ですよ!チーターは最高時速 120 km で走ります。ここでは、3 匹の動物すべてをCat に「一般化」した後でメソッドに渡しているにもかかわらず、オブジェクトの特定の動作が維持されていることがはっきりとわかります。ポリモーフィズムにより、Java はこれらが単なる 3 匹の猫ではないことをよく覚えています。ライオン、トラ、チーターで、それぞれ走り方が違います。 これは、ポリモーフィズムの主な利点である柔軟性を示しています。多くの種類に共通する機能を実装する必要がある場合、ライオン、トラ、チーターは単に「猫」になります。すべての動物は異なりますが、状況によっては、種類に関係なく、猫は猫です:) 以下にビデオで確認します。
この「一般化」が望ましく、代わりに各種が異なる動作をする必要がある場合、各タイプは独自のことを行います。ポリモーフィズムのおかげで、さまざまなクラスに対して単一のインターフェイス (メソッドのセット) を作成できます。これにより、プログラムの複雑さが軽減されます。40 種類の猫をサポートするようにプログラムを拡張したとしても、 40 匹すべての猫に対して1 つのrun()メソッドという最も単純なインターフェイスが得られます。