2017-11-24 27 views
0

から継承型へのSystem.Typeのリストを拘束し:は基本型

List<Type> Requires = new List<Type>(); 

彼らは共通の親を持っているので、どのように私はこのリスト内のタイプを制限でしょうか?例えば

List<Type : Component> Requires = new List<Type>() 

編集:私はこれを必要とする理由もう少し背景はので、多分、人々が理解することができます。私はComponentsのリストを含むクラスEntityを持っています。各コンポーネントには、依存関係のリストとして機能するComponentタイプのリストが必要です。したがって、実行時にEntityComponentを追加しようとすると、そのコンポーネントに既に必要なコンポーネントが付属しているかどうかを確認するクイックチェックが行われます。

例:

//Entity.cs 
//... 
_components = new List<Component>(); 
//... 
public T AddComponent<T>() where T : Component, new() 
{ 
    var temp = new T(); 
    if (_components.Exists((x) => x is T)) return null; 
    foreach (var t in temp.Requires) 
    { 
     if (_components.Exists(x => x.GetType() == t)) return null; 
    } 
    _components.Add(new T()); 
    temp.gameObject = this; 
    return temp; 
} 
//... 

//Component.cs 
//... 
protected internal Entity gameObject; 
protected internal List<Type> Requires { get; } 
//... 
+0

なぜなら「List 」が必要です= new new List = newリスト ?そのリストの各項目は 'Component'か' Component'のサブクラスになります。 – Sweeper

+0

彼は私が思う 'System.Type'クラスについて話しています。 – apocalypse

+0

私は 'System.Type'クラスについて話しています。私はリストにそれらの束を格納しているので、重複があるかどうかを確認するためにコンポーネントのリストに対してそれらをチェックすることができます。 – Julia

答えて

0

は多くの作業の後、私は私自身の問題への解決策を見つけました。

//Component.cs 
public abstract class Component { 
    //... 
    protected internal Entity gameObject; 
    private RequiresList _requires; 
    //... 
    protected internal RequiresList Requires 
    { 
     get => _requires; 
     private set => _requires = (RequiresList)value.FindAll(x => x.IsSubclassOf(typeof(Component))); 
    } 
    //... 
    public class RequiresList : List<Type> 
    { 
     public RequiresList() { } 
     public RequiresList(IEnumerable<Type> types) : base(types) { } 
     public RequiresList(int capacity) : base(capacity) { } 

     public new Type this[int index] 
     { 
      get => base[index]; 
      set 
      { 
       if (isComp(value)) 
        base[index] = value; 
      } 
     } 

     public new void Add(Type type) 
     { 
      if (isComp(type)) 
       base.Add(type); 
     } 

     private static bool isComp(Type type) 
     { 
      return type.IsSubclassOf(typeof(Component)); 
     } 
    } 
    //... 
} 

//Entity.cs 
public abstract class Entity { 
    //... 
    _components = new List<Component>(); 
    //... 
    public T AddComponent<T>() where T : Component, new() 
    { 
     var temp = new T(); 
     if (_components.Exists((x) => x is T)) return null; 
     foreach (var t in temp.Requires) 
     { 
      if (_components.Exists(x => x.GetType() == t)) return null; 
     } 
     _components.Add(new T()); 
     temp.gameObject = this; 
     return temp; 
    } 
    //... 
} 

私は、彼らがComponentのサブクラスであるかどうかを確認するために、それに挿入されているすべてのSystem.Type秒をチェックする新しいストレージタイプのコールRequiresListを作成しました。誰かがまったく新しいリストに置き換えようとした場合、新しいリストのインデックスは削除されないことを確認しました。Component s

関連する問題