5

この例で、オプション 2 が 1 よりも優れている点と不利な点は何ですか?

オプション 1 (継承):

public class SalesList : List<Sales>
{
    //methods that add extra behavior List<Sales>
}

オプション 2 (構成):

public class SalesList 
{
    private List<Sales> _list;
    //methods that add extra behavior to List<Sales>
}
4

5 に答える 5

2

継承により、親が *スーパー* セットで、そのすべての子が *サブ* セットであるようなクラスの階層を形成できます。これにより、一般化、特殊化、および置換原則の適用が可能になります。

于 2012-10-12T11:38:38.803 に答える
2

オプション 2 の利点は俊敏性です。コンポジションを使用すると、リスト インターフェイスのどの部分を公開するかを選択できます。

後で、別のクラスから拡張するのをやめる決心をしたと想像してください。ここまでで、ライブラリの一部のユーザーは List によって提供されるメソッドを使用することになるため、すべてのリスト メソッドを自分で実装する必要があります: add/addAll/contains/retainAll. これは、単純な販売リストを実装するための非常に多くのメソッドです。

基本的に、これは Joshua Bloch がBumper-Sticker API Designで話している「疑わしい場合は除外する」に帰着します。API のすべての面は可能な限り小さくする必要がありますが、小さくすることはできません。後でいつでも追加できますが、削除することはできません。

于 2010-04-06T17:53:06.637 に答える
2

コンポジションの主な欠点は、同じインターフェイスを提示する必要がある場合、プライベート リストのすべてのパブリック メソッドをラップ (複製) する必要があることです。継承では、それらはすべて既に利用可能ですが、いずれもオーバーライドできません。これはオーバーライド可能ではありません (C# ではメソッドを「仮想」とマークする必要があり、Java では「最終」とマークすることはできません)。

C# 3 以降では、拡張メソッドを使用できます。これにより、階層ツリーを完全に混乱させることなく、継承のように見せることができます。

于 2010-04-06T17:56:40.280 に答える
1

オプション 1
- 利点 - 継承と再利用のすべての利点
- 欠点 - コードは、List から派生したものであることを消費者に通知しています。これを後で変更する必要がある場合は、関連するすべてのコンシューマーが影響を受けます。

オプション 2
- 利点 - 販売データの保存に関する実装の詳細は、消費者から離れて抽象化されます。したがって、実装を変更する必要がある場合 (辞書など)、クラスのコンシューマーはこれらの変更の影響を受けません。
- 欠点 - SalesList クラスは、内部の _list オブジェクトを取得および/または設定するための追加のメソッドを公開する必要があります。これは維持する必要がある追加のコードです。また、内部の実装が変更された場合は、以前の動作を引き続きサポートするように注意する必要があります...

頭に浮かぶいくつかの考え。

HTH。

于 2010-04-06T17:53:45.340 に答える
0

コンポジションでは、実行時にスーパークラスの実装を動的に変更できます。ただし、継承を使用すると、実行時にスーパー クラスの実装を変更することはできません。

コンポジションでは、セッターに渡すオブジェクトのタイプに依存し、それに基づいて動作します。これにより、実装の柔軟性が高まります

于 2011-04-16T11:13:01.737 に答える