インターフェース
- 簡単にいうと、中身がないクラスのこと。
-
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)として実装する。
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
まとめ