所以我非常喜歡數據結構,並且我一直在研究以不同方式實現不同類型圖形的類庫。我遇到的絆腳石之一是試圖輕鬆地結合不同類型圖形的特定功能。爲了澄清,假設我有一個名爲IGraph <T>的接口,其中T是每個節點所擁有的數據。現在,我還想要具有IUndirectedGraph <T>,IDigraT >和IWeightedGraph < T,E >的接口,其中E是用作權重的類型。帶接口的C#類型聯盟
我希望能夠提供相同類型圖形的不同實現。例如,我希望能夠提供一個使用鄰接列表和使用鄰接矩陣的類的類。這些類可能具有某些算法的稍微不同的實現。作爲一個簡單的例子,確定給定對象的鄰居在每個實現中將是不同的。
所以,讓我們說我有這兩個類聲明:
class WeightedAdjacencyListGraph<T,E> : IUndirectedGraph<T>, IWeightedGraph<T,E>
class WeightedAdjacencyMatrixGraph<T,E> : IUndirectedGraph<T>, IWeightedGraph<T,E>
我想能夠聲明一個變量類型,可以存儲這兩個類的對象,但保持在定義的功能所有接口。基本上,我希望能夠來聲明一個變量類型,如:
<IUndirectedGraph<object>+IWeightedGraph<object,double>> MyGraph = new WeightedAdjacencyListGraph<object,double>();
MyGraph = new WeightedAdjacencyMatrixGraph<object,double>();
顯然,變量類型聲明是不正確的C#語法,但什麼我會放在這裏?我是否必須爲每個接口組合創建一個新接口?我的設計是否存在根本性缺陷?如果是這樣,我應該怎樣做才能糾正它?
編輯:我決定爲定向/無向圖創建不同的命名空間,並將常見接口(如IWeightedGraph < T,E >)存儲在根名稱空間中。然後,我將基本創建上面提到的組合界面(這些也在答案中註明)。我認爲無論如何,直接/無向圖在共享有趣的算法時不可能共享很多共同點。