[英]Generic interfaces with abstract implementations
我正在嘗試在.NET中實現一些圖搜索算法,以用於娛樂和個人教育。 對於我的實現,我選擇從實現以下接口的Node類開始:
public interface INode<T>
{
T Data { get; }
IDictionary<INode<T>, int> Neighbors { get; set; }
}
該節點包含一些類型為T的Data
,以及與之共享邊的節點字典及其整數距離。 然后我以為可以創建一個抽象的Node
類:
public abstract class Node<T> : INode<T>
{
public T Data { get; private set; }
public IDictionary<INode<T>, int> Neighbors { get; private set; }
public Node(T data, IDictionary<Node<T>, int> neighbors)
{
this.Data = data;
this.Neighbors = neighbors;
}
}
但是上述方法不起作用,因為neighbors
與Neighbors
不匹配。 我希望Node
的構造函數中的任何參數都包括該特定類型Node
的IDictionary
,而不僅僅是實現INode
東西。 例如,稍后我可能會創建一個名為GraphNode的具體類,並且我想確保在構造函數中僅使用GraphNodes。
為了解決這個問題,我可以簡單地將IDictionary Neighbors從INode中取出,並將其放入抽象的Node類中。 盡管使用諸如FakeItEasy之類的框架,這可能會限制我以后測試類的能力,而且我不確定它可能還會帶來什么其他影響。
我將對如何一般性地解決此問題提出一些建議。 如果沒有最佳解決方案,那么各種解決方案的優缺點是什么?
根據給定的代碼,您可以做兩件事來進行編譯。
首先,由於INode<T>
尚未完全實現,因此代碼也無法編譯。 您的接口為Neighbors
定義了一個set
方法,因此您的set
必須是公共的,否則您將必須顯式實現該屬性。
其次,假設您真的想限制構造函數將neighbors
作為Node<T>
類而不是接口上的鍵控字典,那么加載該控件的最快方法就是將this.Neighbors
更改為
this.Neighbors = neighbors.ToDictionary(
neighborDistance => (INode<T>)neighborDistance.Key,
neighborDistance => neighborDistance.Value
);
因為通用IDictionary
不是協變的,所以必須執行類似的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.