委譲と継承
継承と委譲の使い分け。
GoFのデザパタ本でも簡単ではないと書いてある。
ファウラーの『リファクタリング』では
・委譲による継承の置き換え
サブクラスがスーパークラスの一部のインターフェースだけを使っている。あるいはデータを継承したくない。
・継承による委譲の置き換え
委譲を使っていて、すべてのインタフェースに対する単純な委譲をたくさん書いている。
とあるわけだが、もっと概念的である 程度正しい視点があるのでは?
というのも、
みねこあ:憂鬱本を買ってみました
ではじめて知った 実装継承 という言葉が非常にしっくりきたわけです。
これじゃないかと。
そこで、少しググってみた結果、
よく言われる、「継承よりコンポジション(has)して委譲」するべき場面として、
型ではなく実装の再利用を目的としている
時だと、言ってしまってもわりと正しそうだということがわかったわけなので、ここに宣言します。
似たこと書いてあるのを抜いてみる。
上記のように、そのオブジェクトの持つ構造に関して知る/触れる必要が無く、機能のみを再利用したいといった場合に、委譲を使用します。
とかありますね。
継承のリスク
ではもっと難しいことが書いてありますが
継承の階層はその外部に対しては、情報隠蔽されていても、親子間では情報隠蔽がゆるいのです.実装継承を動機とした継承ではなおさらです.子供は親(の実装)に一般的に強く依存しがちです.
とかね。さらに、発展として、
c) 時間の経過によってサブクラスを移り変わるようなオブジェクトを表現できない
-- 略 --
c)は、オブジェクト・コンポジションを推奨する一番わかりやすい例で、動的にサブクラスが推移するようなモデルは静的なクラス定義では表現できません.
は要チェッコ。
GoF本では
クラス継承よりもオブジェクト・コンポジションを使用すること
なんて書いてあるわけですから、そもそも継承しなきゃいけない場合って?
と考えると、JavaやC++ではポリモーフィズムのためにはせざるを得ませんよね
ってことで
継承はポリモーフィズムのための型階層の構築のみを目的とすること
とか、言ってしまえる。ちょっと言いすぎ感がありますが。
継承には実装と型(インターフェース)の継承があるってこと自体が、
オブジェクト指向プログラミングの入門レベルではあまり教えられないのは問題。
実装継承・型(インターフェース)継承
って言葉はもっと流行るべき。
| 固定リンク
「オブジェクト指向プログラミング」カテゴリの記事
- 委譲と継承(2009.03.23)
コメント