Skip to content

6.13 コンポジション

ここまでは、新しいクラスを作るときに「継承」を使ってきました。継承は「子クラスは親クラスである(is-a)」という関係が成り立つ場合に適したテクニックです。 しかし、プログラミングをしていると、継承よりもコンポジション集約と呼ばれる設計の方が理にかなっていることがよくあります。

コンポジション(has-a関係)とは

Section titled “コンポジション(has-a関係)とは”

コンポジションは、「あるオブジェクトが別のオブジェクトを持っている(has-a)」という関係を表します。

アヒルを例に考えてみましょう。 「アヒルは鳥である」という関係は継承(is-a)ですが、「アヒルはくちばしと、しっぽを持っている」という関係はコンポジション(has-a)です。しっぽはアヒルの「種類」ではなく、「一部(部品)」だからです。

実際に、「くちばし(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