簡體   English   中英

通用接口隱藏父非通用接口方法

[英]Generic Interface hiding of parent non-generic interface methods

我想用通用接口IAppcontextItem實現泛型類AppContextItem。 因為我想在List中存儲多個AppContextItem而不知道確切的類型(並且我希望能夠在列表中混合多個類型化的AppContextItem)。 我創建了另一個非泛型接口IAppContextItem。 IAppContextItem的通用實現應該隱藏非泛型字段,但它不知道它,因為我得到一個編譯錯誤,告訴我我需要實現帶返回類型對象的元素。 是不可能做我想要的或做錯了什么?

IAppcontextItem.cs

public interface IAppContextItem
{

    string Key { get; set; }

    object Element { get; set; }

}

public interface IAppContextItem<T> : IAppContextItem 
    where T : class
{
    new string Key { get; set; }
    new T Element { get; set; }
}

AppContextItem.cs

public class AppContextItem<T> : IAppContextItem<T> where T : class
{

    private string key = string.Empty;
    private T element;

    public string Key
    {
        get { return key; }
        set { key = value; }
    }

    public T Element
    {
        get { return element; }
        set { element = value; }
    }

您必須實現T Elemen t和object Element屬性。 object Element的實現如下所示:

object IAppContextItem.Element
{
   get; set;
}

然后,您可以將其強制轉換為正確的界面:

 AppContextItem<MainApp> app = new AppContextItem<MainApp>();
 IAppContextItem iapp = (IAppContextItem)app;
 object o = iapp.Element;

這稱為顯式接口實現

如果你想擁有一個不同的IAppContextItem.KeyIAppContextItem<T>.Key你可以使用這樣的顯式接口實現:

string IAppContextItem.Key
{
    get { return key + "A"; }
    set { key = value; }
}

string IAppContextItem<T>.Key
{
    get { return key + "B"; }
    set { key = value; }
}

這句話表明你的誤解:

IAppContextItem的通用實現應該隱藏非泛型字段,但它不知道它,因為我得到一個編譯錯誤,告訴我我需要實現帶返回類型對象的元素。

界面是合同; 它說“需要這個接口的實現來提供以下方法和屬性......”。 通過繼承隱藏方法或財產既不能履行合同的這一部分,也不會消除合同對實施者施加的要求。

該合同規定,需要實施以提供四個屬性。 其中一些屬性與其他屬性具有相同的名稱並不以任何方式消除您提供合同所描述的每個屬性的要求。 這兩個屬性中的兩個比其他兩個屬性“更明顯”並不會改變合同需要四個屬性的事實。 你還是要實現所有四個; 他們的知名度根本不會影響到它。

Wouter de Kort的回答掩蓋了一個重要的觀點:如果您希望兩個Element屬性引用同一個對象,則不能這樣做:

object IAppContextItem.Element
{
    get; set;
}

如果這樣做,您將發現已為接口的Element屬性創建了一個auto屬性,其屬性值與T -typed Element屬性無關。 相反,你應該這樣做:

object IAppContextItem.Element
{
    get { return this.Element; }
    set
    {
        if (!(value is T))
            throw // ... some exception
        this.Element = (T)value;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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