[Java] Polymorphism


たけいせい
多形性とは,プログラム設計言語が有する資料型システムの性質を指し,プログラム言語の各要素(定数,変数,対象,方法など)は多様な資料型が許容する性質に属する.
すなわち,多形性はプログラム言語の各要素が「多様な形態を持つ能力」であると理解できる.
🤔 しかし、様々な形態を持っているのはどういう意味ですか?
オブジェクト向けの事実や誤解(ウサギ書とも呼ばれる)によれば、多形性とは、異なるタイプのオブジェクトが同じメッセージを受信する際に、異なる方法でメッセージを処理することを指す.この観点から、多形性は、1つのメッセージと1つ以上のメソッドとの関係を意味し、1つのオブジェクトが同じロールを実行できる別のオブジェクトに置き換えられることを意味する.
多機能性のメリット
マルチフォームの利点は、オブジェクトの代替性、設計の柔軟性、再利用性にあります.多形性が保証されている場合、送信者が受信者のタイプを知らなくても、メッセージを送信することができ、送信者に影響を及ぼさずに受信者を置き換えて追加することができる.したがって、新しいタイプのオブジェクトを定義することで責任を果たし、オブジェクト間のコラボレーション範囲を拡張できます.
  • 多形性は、送信者と受信者との間のオブジェクトタイプの結合度をメッセージの結合度に低下させることによって実現される.
  • 親クラスタイプのオブジェクト参照変数では、サブクラスが上書きメソッドを自動的に呼び出すため、コードをきれいに保つことができます.
  • 🧐 Javaのマルチフォームの例を見てみましょう.
    Javaでは、1つのタイプの参照変数を使用して複数のタイプのオブジェクトを参照でき、多形性が実現されます.
    public class Tv {
        boolean power;
        int channel;
    
        void power() {
            power = !power;
        }
    
        void channelUp() {
            ++channel;
        }
    
        void channelDown() {
            --channel;
        }
    }
    
    class SmartTv extends Tv {
        boolean caption;
    
        void displayCaption(String text) {
            if (caption) {
                System.out.println(text);
            }
        }
    }
    たとえば,SmartTVクラスがTvクラスとTvクラスを継承すると仮定する.
    インスタンスのデータ型と参照変数のデータ型を統一すると、Tv t = new Tv();またはSmartTv s = new SmartTv();でインスタンスを生成することができる.
    しかしjavaは多形性を実現するため、祖先タイプの参照変数を使用してサブタイプのインスタンスを参照することができます.△反対するわけにはいかない.
    SmartTv s = new SmartTv();
    Tv t = new SmartTV();
    でも、ちょっと注意が必要です.
    SmartTVインスタンスの参照変数タイプがTvであることを指定した場合、SmartTv(生成されたインスタンス)が持つすべてのメンバーではなく、Tv(参照変数)で定義されたメンバーのみが使用されます.したがって、上記の例を生成する場合、SmartTVでのみ使用できるタイトルおよび表示オプションは、t.captionまたはt.displayCaptionと同じではない.
    Overriding
    メンバーの使用範囲と同様に、親タイプのオブジェクト参照変数を使用しても、サブクラスで上書きするメソッドが呼び出されます.
    class Parent {
        void parentMethod() {
        	System.out.println("I love 🍍");
        }
    }
    
    class Child extends Parent {
        // overriding (재정의: 상위 클래스의 메서드와 같은 메서드 이름, 같은 인자 리스트)
        void parentMethod() {
        	System.out.println("I love 🍇"); 
        } 
    
        // overloading (중복정의: 같은 메서드 이름, 다른 인자 리스트)
        void parentMethod(int i) {
        	System.out.println("I love 🍎");
        } 
    }
    Parent p = new Child();のように、親クラスの参照変数でChildクラスのインスタンスを参照する場合、p.parentMethod();が実行され、出力I love 🍇が確認される.
    パラメータの多形性
  • メソッドのパラメータが祖先タイプの参照変数として定義されている場合、どのサブタイプの参照変数もパラメータとして使用できます.
  • たとえば、Productという親クラスと、Productを継承するTvクラスとComputerクラスがあるとします.製品をパラメータとするbuyメソッドが定義されている場合、Tvまたはコンピュータオブジェクトは、以下に示すようにbuyメソッドのパラメータとして受け入れることもできます.
    void buy(Product p) {
        money = -= p.price;
        bonusPoint += p.bonusPoint;
    }
    Source
  • ジャワの晶石(南宮城底)
  • 対象に向けた事実と誤解(趙英浩著)
  • Spring入門のJavaオブジェクト向け原理と理解(金鐘民著)
  • 多形Wikipedia