🚀 ニフティ’s Notion

ポリモーフィズム

インターフェース
  • 簡単にいうと、中身がないクラスのこと。
  • ABC=Abstract Base Classの略
    from abc import abstractmethod, ABC
    
    
    # インターフェース
    class Animal(ABC):
        @abstractmethod
        def cry(self):
            pass # 中身は書かない
  • メソッドの名前・引数・戻り値のみが書いてある。
    • 実際の処理は書かれないため、インターフェースに書かれているメソッド名・引数・戻り値を実装したクラスが必ず必要になる
  • インターフェースはクラスに実装させることで利点を発揮する。
    • メソッドがインターフェースによって明確に定義されており、インターフェースを継承したクラスAでメソッドの中身の処理部分を製作する。
    • このクラスAを呼び出すとき、インターフェースが持っていたメソッドで呼び出すことで、クラスA独自の処理を行うことができる。
    • さらに、他の処理を持たせたクラスBを作成することで、クラスB独自の処理も行うことができる。
    • しかも、呼び出し元のクラスからはインターフェースしか見えないので、その違いは分からず、これらのクラスは完全にカプセル化されているため安全性も高い。
ポリモーフィズム

ギリシャ語で「多くの形態」の意味。すなわち多様性・多態性。継承と密接な関係があり、オブジェクト指向技術のもっとも強力な利点の1つである。

継承の階層構造では、すべてのサブクラスはスーパークラスのインターフェースを継承している。しかし、サブクラスは別個の実体なので、同じメッセージに対して異なる応答が求められる。

例えば、4体の生命体がいるとしよう。この4体に主が「鳴け」と命令したら、おそらく生命体によって返答がことなるはずであり、これがポリモーフィズムである。

すなわち、ポリモーフィズムとは「異なるオブジェクトが1つのメッセージに対してそれぞれ異なる振る舞いを行うこと」である。

サンプルコード

親クラスのメソッドを子クラスのメソッドで上書きすることをオーバーライドという。ポリモーフィズムを使う場合、継承される場合はオーバーライドされる前提となる。継承される側は空っぽの関数のみを用意し、抽象メソッド(abstractmethod)として実装する。

image block
from abc import abstractmethod, ABC


# インターフェース
class Animal(ABC):
    @abstractmethod
    def cry(self):
        pass


class Dog(Animal):
    def cry(self):
        print("わんわん")


class Cat(Animal):
    def cry(self):
        print("にゃー")


class Elephant(Animal):
    def cry(self):
        print("ぱおーん")


class Alien(Animal):
    def cry(self):
        print("くぁwせdrftgyふじこlp")


def cry(animal: Animal):
    animal.cry()


if __name__ == "__main__":
    dog = Dog()
    cat = Cat()
    elephant = Elephant()
    alien = Alien()

    dog.cry()
    cat.cry()
    elephant.cry()
    alien.cry()

▼ 実行結果

$ python sample_polymorphism.py
わんわん
にゃー
ぱおーん
くぁwせdrftgyふじこlp

まとめ

インターフェイスは振る舞いを持たないクラスのようなもの
ポリモーフィズムは継承やインターフェースを使って、具象クラスを切り替えることで様々な振る舞いを持たせられるようになること