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

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

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

 

同じメソッド呼び出しに対し、異なるオブジェクトごとが各動作をすること。
( 共通のメソッドを呼び出すが、オブジェクトによってその機能を変化させる。
  ex ) getGreek( ) を呼びだしているが、Alpha 、Beta 、Gamma と各動作をしている。

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

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

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

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

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

 

 

なぜ必要か

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

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

 

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 キーワードを付ける。

 

 

こちらから。
https://qiita.com/lrf141/items/a2f764c8d87de26b6f45
http://garicchi.hatenablog.jp/entry/2014/09/11/181456
https://ufcpp.net/study/csharp/oo_polymorphism.html

以上。