2017-05-22 7 views
0

私は派生クラスを持つ基本抽象クラスを持つクラス構造を持っています。ベースクラスでジェネリック型を使用するにはどうすればよいですか?

私の基底クラスは次のようになります。

public abstract class Graph 
{ 
    public Dictionary<Vector3, int> Dictionary { private set; get; } 
    public List<T> List { set; get; } 

    public Graph() 
    { 
     Dictionary = new Dictionary<Vector3,int>(); 
    } 
} 

それから私は2つの派生クラスがあります。

public class Graph_Waypoints : Graph 
{ 
    public Graph_Waypoints() : base() 
    { 
     List = new List<Waypoint>(); 
    } 
} 
public class Graph_Tiles : Graph 
{ 
    public Graph_Tiles() : base() 
    { 
     List = new List<Tile>(); 
    } 
} 

をしかし、私がこのように私のグラフのための柔軟なタイプを行うことができないようです。ここでの考え方は、ノードに異なるオブジェクトを使用できるグラフを作成することです。ウェイポイントグラフでもタイルベースのグラフでも構いません。

しかし、私はそれぞれの新しいグラフを作成するときにタイプを変更できるように柔軟性を持たせる方法を考えるのに苦労しています。

ここは正しい方向に向いていますか?私のリストにタイプの柔軟性を持たせるにはどうすればいいですか?

答えて

4

あなたはほぼそこにいます。あなただけのいくつかの重要な部分が欠落している:

public abstract class Graph<T> // <-- Graph must be generic 
{ 
    public Dictionary<Vector3, int> Dictionary { private set; get; } 
    public List<T> List { set; get; } 

    public Graph() 
    { 
     Dictionary = new Dictionary<Vector3, int>(); 
     // You could initialize the list as you did before, but it's cleaner to do it here 
     List = new List<T>(); 
    } 
} 

public class Graph_Waypoints : Graph<Waypoint> // <-- Subclasses must provide the base class generic arguments 
{ 
    public Graph_Waypoints() : base() 
    { 
    } 
} 
public class Graph_Tiles : Graph<Tile> 
{ 
    public Graph_Tiles() : base() 
    { 
    } 
} 

また、あなたは、引数なしのコンストラクタを実装する際に、明示的に: base()を記述する必要はありません、注意してください。コンパイラはあなたのためにそれを行います

+1

ああありがとう!今私はそれがすべてどのようにつながるのか理解しています! – Sir

関連する問題