ポリモーフィズムについて少しだけメモ

スーパークラスの型の変数に、サブクラスのインスタンスを代入できる。

逆のサブクラスの型にスーパークラスインスタンスは代入できない。

大は小を兼ねるみたいなこと。

同じ名前のメソッドを呼び出しても、インスタンスの種類(クラス)によって異なる処理が実行されます。

オブジェクト指向プログラミングの構成要件はWikipediaによると以下のようになります。 * カプセル化 * ポリモーフィズム

https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91

その中でポリもーフィズムは

あるオブジェクトへの操作が呼び出し側ではなく、受け手のオブジェクトによって定まる特性。クラスベースのオブジェクト指向の場合には、派生クラスの複数分岐として多態性を実現する。 プロトタイプベースのオブジェクト指向の場合では関係がない概念とされる。

以下のブログに簡単にカプセル化ポリモーフィズムが説明してあった。

http://brbranch.jp/blog/201511/%E9%9B%91%E8%A8%98/oop/

カプセル化とは、簡単に言えば「オブジェクトの内部データはそのオブジェクトにしか扱わせない」というひとつの宣誓です。 そしてポリモーフィズムとは、「オブジェクトがどんな振る舞いをするかそのオブジェクトにまかせる」原則になります。

class Person{
  // Personクラス
}
class Man extends Person{
  // Manクラス
}
class Woman extends Person{
  // Womanクラス
}

// インスタンス代入できる
Person m = new Man();

// 逆はダメ(コンパイルエラー)
Man m = new Person();

ポリモーフィズムのメリット

class Person{
  void walk(){
    System.out.println("人が歩く");
  }
}
class Man extends Person{
  // オーバーライド
  void walk(){
    System.out.println("男が歩く");
  }
}
class Woman extends Person{
  // オーバーライド
  void walk(){
    System.out.println("女が歩く");
  }
 void talk(){
    System.out.println("井戸端会議");
  }
}
Person w = new Woman();

// コンパイルエラー
// あたかもPerson クラスのインスタンスであるかのように扱われるため
w.talk();
w.walk();  // 女が歩く

Person m = new Man();
m.walk();  // 男が歩く

ちなみにw.talk();コンパイルエラーはキャストを使って((Woman)w).talk();でエラーなく通る。

Person 型の変数が参照するインスタンスに対してwalk メソッドを呼び出 すと、そのインスタンスのクラスに応じて実行結果が変わってきます。このよう な性質がポリモーフィズムなのです。

class PersonWalk{
  public static void main(String[] args){
    Person[] persons = new Person[3];
    person[0] = new Person();
    person[1] = new Man();
    person[2] = new Woman();

    for(int i = 0; i < persons.length; i++){
      persons[i].walk();
    }
  }
}

実行結果は

人が歩く
男が歩く
女が歩く

以下のブログ記事も参考になった。 http://noiselessworld.hatenablog.jp/entry/2017/01/30/002252

プログラマー1年生がポリモーフィズムについて学んだのでRPGで説明する。 - Qiita

最後

正しい内容を理解しているかは怪しいので、もっと深めていく必要があると感じる。