1

財務モデリング用のクラス ライブラリを作成しています。

インターフェイスを使用してモデルを定義し、テスト用の抽象化を作成し、後で新しい具象クラスを追加できるようにしたいと考えています。

モノのリストを定義する方法に苦労しているので、後で具象クラスでそれらのリストに追加できます。

たとえば、モデルに費用のリストがあるようにインターフェイスを定義すると、

IEnumerable Expenses {get; 設定;}

後で具体的な XYZExpense のリストを含む ABCModel という具体的なクラスを作成したい場合、リストに項目を簡単に追加できるようにリストを実装する最良の方法は何でしょうか?

List を IEnumerable としてキャストできません。

たとえば、次のようになります。

 public interface IFinancialModel
{
    IEnumerable<IExpense> Expenses { get; }
    IEnumerable<IRevenue> Revenue { get; }
    IEnumerable<IAsset> Assets { get; }
    IEnumerable<ILiability> Liabilities { get; }
}

public class FinancialModel と呼ばれる具体的なクラスが必要です: IFinancialModel

具体的なアイテムを追加することができます。

独自の「追加」メソッドを作成する必要がありますか? 理想的には、車輪の再発明ではなく、組み込みのリスト機能を活用したいと考えています。

4

2 に答える 2

2

それはあなたが実際に何をしたいかによります。Listまたはプロパティを持つIListことはお勧めしません。これは、所有するクラスがそれを認識しなくてもClear、すべて ( など) を使用できるためです。Addこれはカプセル化には適していません。変更時に何かを行うことはできません (ダーティ フラグの設定、変更されたイベントの起動、検証の実行など)。

IEnumerable良い選択です。

セッターを追加することはできますが、プロパティに設定された値を参照によって取得しないでください。Linq クエリやデータベース クエリなど、参照したくないものであれば何でもかまいません。欲しいのは商品だけ。(また、外部からのコレクションへの参照を他のインスタンスに割り当てることができることも考慮してください。これは、そこで変更すると非常に悪い副作用をもたらしますが、ここでは変更しないでください。)

// example implementation with a setter
private List<IExpense> expenses 

public IEnumerable<IExpense> Expenses 
{ 
  get { return expenses; }
  set { expenses = value.ToList(); }
}

または、独自のAdd、などのメソッドを実装することもできます。ただし、主なユースケースが一度にすべての項目を設定することである場合は、前に示したプロパティのセッターと同じメソッドのみを持つことができます。内部で配列として保持することを検討してください。AddRangeRemoveClearSetExpenses

于 2016-09-12T18:22:01.660 に答える
0

あなたが探しているのは ですIList<T>。これは、実際のリストの実装を隠しながらリストを公開できるインターフェイスです。例:

interface IFinancialModel {
    IList<IExpense> Expenses { get; }
}

次に、ニーズを満たすリストを実装します。例えば:

class FinancialModel : IFinancialModel {
    private IList<IExpense> _expenses = new List<IExpense>();
    IList<IExpense> Expenses { get { return _expenses; } }
}

ただし、@Stefan に同意します。リストを公開するとカプセル化が破られるため、通常は避ける必要があります。

于 2016-09-12T18:24:05.110 に答える