委譲による継承の置き換え Replace Inheritance with Delegation


継承、委譲とは

そもそも継承とは、親にあたるクラスから財産を受け継ぐこと。
多くのオブジェクト指向プログラミング言語は、継承の機能を持っている。

委譲とは、「他のクラスから別のインスタンスのメソッドを呼び出し処理を実現する」こと
要するにおまかせをするということ。

継承と委譲の比較

継承 : クラス同士の関係
委譲 : インスタンス同士の関係

継承を多様する課題

  • サブクラスがスーパークラスの機能の一部しか利用していない。
  • サブクラスがスーパークラスとIS-A関係にない
  • LSPに反している
  • 契約を守っていない

結果

  • 不適切な継承関係の解消
  • クラスが必要としている機能が明確になる
  • クラスの改良・機能追加が容易になる
  • 以上を行うメソッドを記載する必要がある

サンプルコード

Another.java

Class Another {
    void method()
    ...
}

Class Something extends Another {
}
Something.java
Class Something {
    Another _delegate = new Another();
    ...
    void method() {
        _delegate.method();
    }
}

補足

相続拒否とは

継もとの大半のメソッドを使わっていない。
この相続拒否は、契約違反でもある。
リファレンス・マニュアルを見て、制約条件をまもる必要もある。

Chain Constructors

コンストラクタを複数用意する場合、
重複したコードになる。
それを引数なしのコンストラクタから、引数ありのコンストラクタを呼び出すことで、冗長化を防ぐ。

リスコフの置換原則