ポリモーフィズム ( 多態性 ) とは

よく分からなかったが「なぜ必要か」を読んだらわかったと思う。例ソース見た方が分かりやすいかも。

オブジェクトが複数の型属することを許す性質のこと。

 

具体的にいうと、
仮想メソッドを用いると、同じメソッドを呼び出しても
変数に格納されているインスタンスの型によって異なる動作をする。
同じメッセージ ( メソッド呼び出し ) に対し、異なるオブジェクトごとが
各動作をすることを多態性という。
( 共通のメソッドを呼び出すが、オブジェクトによってその機能を変化させる )
  ex ) getGreek( ) を呼びだしているが、Alpha 、Beta 、Gamma と各動作をしている。

仮想メソッド:
virtual 修飾子によって宣言されたメソッドで、
派生クラスによってメソッドの実装を取り換えることを許容する。

 

抽象クラスインターフェースなどを利用してメソッドの呼び出し方を共通化し、
さらに、オーバーライドさせることで同じメソッドを呼び出しても、
実際のインスタンスごとにその挙動を変化させようとするもの。
クラスの連携・メソッドの呼び出しを子クラスの型でなく、
親クラスの型で行える為、クラスの独立性を高めることになる。独立性?

抽象クラス
中身のない定義が含まれるクラス。

インターフェース
一切中身を持たないクラス。中身はインスタンス先で実装。

オーバーライド
親クラスで定義されているメソッドを子クラスで再定義すること。

・オーバーライドは継承。オーバーロードは継承関係ない。
スーパークラスはベースクラス、基底クラスとも。サブクラスは派生クラスともいう。

 

 

なぜ必要か

この機能がないと、各子クラスのインスタンスを別々に生成しなければならない。
子クラスの変数に別のクラスのインスタンスを代入できないから。

ポリモーフィズムを実装することにより、一つの親クラスの変数
他の子クラスインスタンス代入できるので、
統一した記述方法それぞれのオーバーライドメソッドを呼び出すことができる。
つまり、サブクラスごとに全く別の機能とすることが出来る。

 

Java からのソース引用 ※色々略・動かしてない。
main は getGreek( ) を呼んでいる。
getGreek( ) の戻り値は、親クラスの配列だが、
配列の中には各子クラスのインスタンスが入っている。

        public static void main()
        {
            Greek[ ] g = Language.getGreek();
           
            // αβγが表示
            for(gStr : g)
            {
                gStr.Show();
            }
           
            //この書き方も可かと
            Greek gA = new Alpha();
            Greek gB = new Beta();
        }

    class Language
    {
        public static Greek[ ] getGreek()
        {
            Greek[ ] greekStr = { new Alpha(), new Beta(), new Gamma() };
            return greekStr;
        }
    }

    abstract class Greek  // 抽象クラス
    {
        public abstract void Show();
    }

    class Alpha extends Greek  // class Alpha : Greek [ C# ver ]
    {
        public void Show()  // public override void Show(); [ C# ver ]
        {
            System.put.println("α");
        }
    }
   
    class Beta extends Greek
    {
        public void Show()
        {
            System.put.println("β");
        }
    }
   
    class Gamma extends Greek
    {
        public void Show()
        {
            System.put.println("γ");
        }
    }

C# ではメソッドをオーバーライドする時、意図しないところでメソッドが
オーバーライドされるのを防ぐため、override キーワードを付ける。

 

 

こちらから。
http://www.itsenka.com/contents/development/java/object.html
https://qiita.com/lrf141/items/a2f764c8d87de26b6f45
http://garicchi.hatenablog.jp/entry/2014/09/11/181456
https://ufcpp.net/study/csharp/oo_polymorphism.html
https://ufcpp.net/study/csharp/oo_polymorphism.html#polymorphism

以上。

--Memo--
オーバーロード多態性の一種と考えられる。
オーバーロードは動作がコンパイル時に決定するが ( 静的多態性 ) 、
オーバーライドは実行時に決定する ( 動的多態性 ) 。