我正在尝试实现以下目标:

interface IAbstract
{
    string A { get; }
    object B { get; }
}

interface IAbstract<T> : IAbstract
{
    T B { get; }
}

class RealThing<T> : IAbstract<T>
{
    public string A { get; private set; }
    public T B { get; private set; }
}

所以我可以做这样的事情:
RealThing<string> rt = new RealThing<string>();
IAbstract ia = rt;
IAbstract<string> ias = rt;
object o = ia.B;
string s = ias.B;

这可能吗?

最佳答案

非常接近。三件事:

  • 您应该在new中使用IAbstract<T>来表明您知道自己隐藏了现有成员:
    new T B { get; }
    

    但是即使没有这些,您仍然只会收到警告。
  • 您需要在IAbstract.B内实现RealThing,几乎可以肯定地应该使用显式接口(interface)实现将它委派给强类型成员:
    object IAbstract.B { get { return B; } }
    
  • 在测试代码中,您需要为RealThing指定类型参数:
    RealThing<string> rt = new RealThing<string>();
    

  • 这很好,对于希望能够获得非通用形式的接口(interface)的时间,甚至是一种合理的通用模式。

    关于c# - 泛型IAbstract <T>继承自IAbstract,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23724772/

    10-11 00:59