2017-04-01 25 views
2

今日はC#のジェネリックスとインターフェイスで遊んでいて、古典的な定義Graphsを実装しようとしています。ここでは(唯一の運動のために)私の最高の試みです:C#クラス宣言のジェネリックパラメータの複製

interface IVertex 
{ 
    string Name { get; set; } 
} 

interface IEdge<V> where V : IVertex 
{ 
    V From { get; set; } 
    V To { get; set; } 
} 

interface IGraph<V, E> where E: IEdge<V> where V: IVertex 
{ 
    IList<V> Vertices { get; } 
    IList<E> Edges { get; } 
} 

class Vertex : IVertex 
{ 
    public string Name { get; set; } 

    public Vertex(string name) 
    { 
     Name = name; 
    } 
} 

class Edge<V> : IEdge<V> where V: IVertex 
{ 
    public V From { get; set; } 
    public V To { get; set; } 

    public Edge(V from, V to) 
    { 
     From = from; 
     To = to; 
    } 
} 

class Graph<V, E> : IGraph<V, E> where E: IEdge<V> where V : IVertex 
{ 
    public IList<V> Vertices { get; } = new List<V>(); 
    public IList<E> Edges { get; } = new List<E>(); 
} 

しかし、以下の使用であるため、私は、私が何か間違ったことをやっていることを、考える:

var a = new Vertex("A"); 
var b = new Vertex("B"); 
var c = new Vertex("C"); 

var x = new Edge<Vertex>(a, b); 
var y = new Edge<Vertex>(b, c); 
var z = new Edge<Vertex>(c, a); 

var graph = new Graph<Vertex, Edge<Vertex>>() 
{ 
    Vertices = { a, b, c }, 
    Edges = {x, y, z} 
}; 

私は一般的な引数を指定する必要がVertex (行new Graph<Vertex, Edge<Vertex>>())...

+0

それには何も問題はありません(少なくとも*それ以上ではありません)。何が役に立つのかは、ジェネリックパラメータを省略できるように(Edgeクラスレベルでtypeパラメータを省略して)、 'Edge:IEdge 'と書くことです。 –

+0

何が質問ですか? – Alejandro

+0

@Alejandro私は質問がグラフクラスのテンプレート(または一般的な)特殊化に関するものだと思います – Everyone

答えて

0

これ以上の制約がないと、制約と要件が何であるかはっきりしません。しかし、達成しようとしているものによっては、IList<E>が適切に宣言されていることを確認するために、現在の構文が必要な場合があります。

は、Graphクラスが正確にIEdge<V>タイプを持つ必要があります。もしそうなら、あなたはこのようにそれを宣言することができます:

class Graph<V> : IGraph<V, IEdge<V>> where V : IVertex 
{ 
    public IList<V> Vertices { get; } = new List<V>(); 
    public IList<IEdge<V>> Edges { get; } = new List<IEdge<V>>(); 
} 

をこのアプローチでは、あなたができ、例えばできませんタイプIList<E>の変数にEdgesを割り当てます。Eは、IEdge<V>以外のタイプです。

IList<Edge<Vertex>> list = graph.Edges; 

それすべてはあなたが実際にこれらの型を使用する方法に依存します:あなたが指定する両方のタイプが必要な場合、それは仕事だろうがたとえば、これは、動作しないでしょう。