1. ホーム
  2. java

[解決済み] ポリモーフィズム vs オーバーライド vs オーバーローディング

2022-03-14 22:49:12

質問

Javaで言えば、誰かに聞かれたとき。

<ブロッククオート

ポリモーフィズムとは何ですか?

Would オーバーローディング または オーバーライド という答えが返ってくるのでしょうか?

もうちょっとあると思うんですけどね。

抽象的なベースクラスで実装のないメソッドを定義し、そのメソッドをサブクラスで定義した場合、それはやはりオーバーライドになるのでしょうか?

私が思うに オーバーローディング が正解でないことは確かです。

どのように解決するのですか?

ポリモーフィズムを表現する最も明確な方法は、抽象的な基底クラス(またはインターフェース)を用いることです。

public abstract class Human{
   ...
   public abstract void goPee();
}

このクラスが抽象的なのは goPee() メソッドは、Humans では定義できません。 これは、サブクラスであるMaleとFemaleに対してのみ定義可能です。 また、Humanは抽象的な概念であり、MaleでもFemaleでもないHumanを作ることはできません。 どちらか一方でなければなりません。

そこで、抽象クラスを使って実装を先送りします。

public class Male extends Human{
...
    @Override
    public void goPee(){
        System.out.println("Stand Up");
    }
}

そして

public class Female extends Human{
...
    @Override
    public void goPee(){
        System.out.println("Sit Down");
    }
}

これで、人間だらけの部屋に「おしっこしてこい」と言えるようになりました。

public static void main(String[] args){
    ArrayList<Human> group = new ArrayList<Human>();
    group.add(new Male());
    group.add(new Female());
    // ... add more...

    // tell the class to take a pee break
    for (Human person : group) person.goPee();
}

これを実行すると、次のようになります。

Stand Up
Sit Down
...