2012-02-14 9 views
4

ASP.NET MVC2でモデルクラスのインターフェイスを作成しようとしていますが、別のインターフェイス内でList<interface>を使用できるかどうかは疑問です。私がコード例を挙げると良いでしょう。リスト<interface>を別のインターフェイス内に使用するC#

私は2つのインターフェースを持っています。端末は複数のベイを持つことができます。だから私は以下のような私のインターフェイスを記述する。

ベイインタフェース:

public interface IBay 
{ 
    // Properties 
    int id {get; set;} 
    string name {get;set;} 
    // ... other properties 
} 

端末インタフェース:

public interface ITerminal 
{ 
    // Properties 
    int id {get;set;} 
    string name {get;set;} 
    // ... other properties 
    List<IBay> bays {get;set;} 
} 

私の質問は、私は、私はベイのリストを設定するには、どのようにこれらのインタフェースに基づいて私のクラスを実装する場合です。私は、ITerminalインターフェイスの外側と具体的な実装の内側にベイのリストを作成する必要がありますか?

具体的な実装:
ベイクラス:

class Bay : IBay 
{ 
    // Constructor 
    public Bay() 
    { 
     // ... constructor 
    } 
} 

ターミナルクラス:その後、

class Terminal : ITerminal 
{ 
    // Constructor 
    public Terminal() 
    { 
     // ... constructor 
    } 
} 

そして

がアクセスできる

私の目標は、次の操作を行うことができるようにすることですこのようなベイのリスト

Terminal.Bays 

ご協力いただきありがとうございます。

+2

ベイは「IList 」でなければならないという一般的な設計提案以外は、コードは上手く見えます。それについての何かがうまくいかないのですか? –

+0

申し訳ありませんがわかりません。 ITerminalインターフェイスは、ターミナルオブジェクトに 'Bays'アクセサを追加する必要があることを意味し、' List 'を作成して' Bay'オブジェクトを追加してアクセサに戻すことができます。あるいは 'List 'を 'List 'として返すように設定する方法を意味しますか? – Rup

+0

@ChrisShain:これはもっと構造的な質問とベストプラクティスでした。 – Gnex

答えて

4

これは正常に動作するはずです。 TerminalクラスにはまだList<IBay>が含まれており、必要に応じてBayのインスタンスが設定されていることに気付くだけです。 (ただし、私が代わりにIList<IBay>を使用することをお勧めしますことに注意してください。)

あなたは具体的なBay型を返すために端末たい場合は、あなたがあなたのターミナルインタフェースを再設計する必要があり、これを修正します:

public interface ITerminal<T> where T : IBay 
{ 
    // Properties 
    int Id {get;set;} 
    string Name {get;set;} 
    IList<T> Bays {get;} 
} 

public Terminal : ITerminal<Bay> 
{ 
    private List<Bay> bays = new List<Bay>(); 
    IList<Bay> Bays { get { return bays; } } 
    // ... 
    public Terminal() 
    { 
     bays.Add(new Bay { //... 

しかし、この複雑さを加えることにはほとんど価値がないかもしれません。

+1

+1:ターミナルはいつも同種のベイリスト(つまり同じタイプのものや共通の基本タイプの共有)を持っていれば、私は個人的にこのアプローチ(ジェネリック)を好みます。 – Douglas

+0

ありがとうございました。あなたの答えの一部をとり、上記の@Douglasと組み合わせます。 – Gnex

+0

@Douglas:はい、ベイは常に同じタイプなので、このようなインターフェースを実装します。 – Gnex

6

インターフェイスのリストを具体的なインスタンスで入力して初期化することができます。あなたのコードについて

Terminal terminal = new Terminal 
{ 
    id = 0, 
    name = "My terminal", 
    bays = new List<IBay> 
    { 
     new Bay { id = 1, name = "First bay" }, 
     new Bay { id = 2, name = "Second bay" }, 
     new Bay { id = 3, name = "Third bay" }, 
    } 
}; 

いくつかのポイント:たとえば、object and collection initializersを使用してTerminalクラスを初期化するには、のようなコードを使用することができ慣例により

  • は、すべてのパブリックプロパティをPascalCasedする必要があります。 IdまたはIDの代わりidを使用します。 nameの代わりにName; baysの代わりにBaysです。
  • インターフェイスに重点を置いているので、プロパティのタイプをList<IBay>からIList<IBay>に変更することを検討する必要があります。これにより、消費者は配列IBay[]を割り当てることができます。
+0

ありがとうございます。これは私がどのように私のインターフェースを設定するべきかについての質問でした。私はベストプラクティスが何であるか不明であった。あなたの答えは、私が探していたものを正確に教えてくれます。どうもありがとうございました。 – Gnex

関連する問題