2016-08-06 23 views
0

私はクラスがComponentで、インターフェイスがIInventoriableです。コンポーネントのクラスのオブジェクトのリストを持つ必要があり、this answer in Javaと同様のIInventoriableインターフェイスを実装します。インターフェイスを実装する特定のクラスのリストを持っています

例の擬似コード -

public List<Component implements IInventoriable> Inventory; 

がどのように私はこのような何かを成し遂げるかもしれない/それは、C#でさえ可能ですか?

Componentをサブクラス化する方がよいでしょうか?状況によっては、Unityのような多くのゲームエンジンにあるエンティティコンポーネントシステムを使用しています。

+0

リストを作成するときにlinq 'OfType'を試すことができます。リストはリストにすることができますが、リストをフィルタリングまたはフィルタリングするときには、 'IInventoriable'も実装しているComponent派生オブジェクトのみを返すlinq拡張' Inventory.OfType () 'を使用できます – Nkosi

答えて

3

リストを作成するときにlinq OfTypeを試すことができます。リストはList<Component>することができますが、リストを、それを埋めるか、フィルタリングするときにのみ、また、これらの制約を使用して独自のリスト派生ジェネリッククラスを作成IInventoriable

それとも

を実装Component派生オブジェクトを返しますLINQ拡張Inventory.OfType<IInventoriable>()を使用することができます

public class InventoriableComponentList<T> : System.Collections.Generic.List<T> 
    where T : Component, IInventoriable { 

    public InventoriableComponentList() 
     : base { 

    } 

    public InventoriableComponentList(IEnumerable<T> collection) 
     : base(collection) { 

    } 
} 
+1

制約付きリスト派生クラスは回答。 –

+0

@Nkosi初心者質問のお詫びですが、このタイプのオブジェクトをどのように宣言しますか?'public InventoryList 'は私の最高の推測ですが、うまくいきません。 –

+0

あなたはまず 'Component、IInventoriable'から継承するクラスを持っていなければなりません。 public class ExampleClass:Component、IInventoriable {} 'のように宣言し、' public InventoryList {get;}のように宣言することができます。 set;} 'プロパティとして宣言されている場合 – Nkosi

2

これは型パラメータなしでは可能ではないと思います。タイプを使用すると、あなたのクラス、常にComponent implements IInventoriableされるという制約を持つタイプのparamを与えることができる

int Method<T>(List<T> inventory) where T : Component, IInventoriable { ... } 

ような何かを行うことができますが、あなたはどのおそらく、それを設定する方法を見つけ出す必要があるだろうのparamsその後、別の、別のタイプのparamなしには不可能であろう...


しかし、いくつかの他のオプションがあります。

  • IInventoriable機能のFRを分離コンポーネントをオフにします。たとえば、Componentオブジェクトのインスタンス変数はinventoryItemで、IInventoriableです。コンポーネントが発明可能でない場合は、inventoryItemよりもnullとなります。そして、あなたがComponent機能を使用するつもりはない場合、それは
  • 、ちょうどList<IInventoriable>
  • を持っているこれらの inventoryItemの代わりに
  • は、インターフェイスにComponentを構成するコンポーネントのリストのリストを作成し、IInventoriableインタフェースimplementを持っています
  • IInventoriableのすべてのオブジェクトがComponentsであることが絶対にわかっている場合は、ランタイムチェックを行います。 List<IInventoriable>があり、必要に応じてコンポーネントにキャストしてください。
関連する問題