簡體   English   中英

具有抽象實現的通用接口

[英]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;
    }
}

但是上述方法不起作用,因為neighborsNeighbors不匹配。 我希望Node的構造函數中的任何參數都包括該特定類型NodeIDictionary ,而不僅僅是實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM