一般的に、合成は継承より強力です。継承は多くの微妙な問題を引き起こしますが、最も一般的なのはdiamond problemですが、他にも多くの問題があります。
委任はストラテジーパターンの特定の定式化に過ぎず、継承ではなくコンポジションでオブジェクトを拡張することができます。問題の具体的な例として
、そしてあなたが継承を使用するときにダイヤモンドの問題はでゾッどのように、このことを考慮してください。
- あなたは細胞を提供したい非常に一般的な方法を持っています。たとえば、Core Dataフェッチ要求、またはセルを生成するネットワーク要求が必要です。したがって、このロジックをすべてカプセル化したスーパークラスを構築します。それを扱うクラスを
FetchRequestDataProviding
と呼びます。
- これとは別に、あなたはたくさん使っている視覚的な振る舞いを持っています。たとえば、ビューには特定の種類のアニメーションが必要なので、これをクラス
FadeInTableView
にラップします。
ここでは、両方が必要なので問題があります。だから私たちは複数の継承が必要です。また、複数の継承はPandoraのあいまいさの箱です。
しかし、私がFetchRequestDataProviding
をデリゲートとして振る舞う別のオブジェクトにすると、そのすべてが排除されます。デリゲート/戦略としてFadeInAnimating
を打ち破ることで、実際にはもっと強力なものにすることができました(ただし、UIView
には今日その力はありません)。
ObjCでは、「構成は継承よりも強力です」は、かなり浅い継承ツリーと多くの代理人に共通することを示しています。 Swiftは継承のないプロトコルと構造体でこれをさらに進めます。これは、継承が悪いことを意味するものではありません。 (Goのような言語は完全に回避されますが、興味深いことに埋め込みのためにダイヤモンドの問題に直面していますが)多くの価値があります。しかし、疑わしいときは、構成がより強力なツールになります。
しかし、テーブルビューはそのデータについて何も知らないので、ビューコントローラ(通常)はテーブルビューのデータソースです。 – rmaddy
'UITableViewDelegate'メソッドが' UITableView'のメソッドであれば、セルが選択されたことをどのように通知されますか? – dan
'UITableView'はビューです。モデルについて知ってはいけません。そこで、どのくらいの数のアイテムが必要か、どのコンテンツがあるかなどについて、 'ViewController'に問い合わせます。それは責任を分けます。 – shallowThought