6.13 コンポジション
ここまでは、新しいクラスを作るときに「継承」を使ってきました。継承は「子クラスは親クラスである(is-a)」という関係が成り立つ場合に適したテクニックです。 しかし、プログラミングをしていると、継承よりもコンポジションや集約と呼ばれる設計の方が理にかなっていることがよくあります。
コンポジション(has-a関係)とは
Section titled “コンポジション(has-a関係)とは”コンポジションは、「あるオブジェクトが別のオブジェクトを持っている(has-a)」という関係を表します。
アヒルを例に考えてみましょう。 「アヒルは鳥である」という関係は継承(is-a)ですが、「アヒルはくちばしと、しっぽを持っている」という関係はコンポジション(has-a)です。しっぽはアヒルの「種類」ではなく、「一部(部品)」だからです。
コンポジションの実装例
Section titled “コンポジションの実装例”実際に、「くちばし(Bill)」と「しっぽ(Tail)」のオブジェクトを作り、それを新しい「アヒル(Duck)」オブジェクトの部品として持たせてみましょう。
# 部品となるクラス1:くちばしclass Bill(): def __init__(self, description): self.description = description
# 部品となるクラス2:しっぽclass Tail(): def __init__(self, length): self.length = length
# これらを持つクラス:アヒルclass Duck(): def __init__(self, bill, tail): # 渡されたオブジェクトを自分の属性として保持する self.bill = bill self.tail = tail
def about(self): # 保持している部品(オブジェクト)の属性にアクセスする print('This duck has a', self.bill.description, 'bill and a', self.tail.length, 'tail')これらのクラスを使って、部品を組み立ててアヒルを完成させます。
# まず部品となるオブジェクトを作成するtail = Tail('long')bill = Bill('wide orange')
# 部品を渡して、アヒルオブジェクトを作成するduck = Duck(bill, tail)
# 動作確認duck.about()# 出力: This duck has a wide orange bill and a long tail