通用类实现接口失败

时间:2010-04-22 08:19:56

标签: c#

在compimation中遇到一个奇怪的问题,说类没有实现接口。

让我们说v得到了一个班级:

public Class MyClass
{
...
}

和一个interace:

public Interface IMyInterface
{
 MyClass PropertyOfMyClass {get;}
}

现在是一个通用类:

public class MyGeneric<T> where T:MyClass
{
  T PropertyOfMyClass 
  {
    get{return ...;}
  }
}

直到这里,每个人都很好并且编译正确。

但是这会在编译时打破:

public class MyGeneric<T>:IMyInterace where T:MyClass
    {
      T PropertyOfMyClass 
      {
        get{return ...;}
      }
    }

说MyGeneric没有实现IMyInterface的方法。但显然确实如此,不是吗?

2 个答案:

答案 0 :(得分:6)

您无法从具有差异的接口实现属性(或方法)。这不仅会影响泛型。例如:

public interface IFoo
{
    object Bar();
}

public class Foo : IFoo
{
    // This won't compile
    string Bar() { return "hello"; }
}

现在你可以通过显式接口实现来解决这个问题:

public class Foo : IFoo
{
    // Make the interface implementation call the more strongly-typed method
    object IFoo.Bar() { return Bar(); }

    string Bar() { return "hello"; }
}

这可能是你的答案 - 或者可能不是。我们需要确切地知道为什么要将属性声明为T类型,而不仅仅是MyClass才能确定。

答案 1 :(得分:1)

另一种解决方法是使接口通用:

public interface IMyInterface<T> where T : MyClass
{
    T PropertyOfMyClass { get; }
}

然后你可以在课堂上使用它:

public class MyGenericClass<T> : IMyInterface<T> where T : MyClass
{
    T PropertyOfMyClass 
    { 
        get { ... } 
    }
}

请注意,使用此实现时,泛型类中对T的约束可能与接口上的约束不同,只要它确保遵循接口约束:

public class MyOtherClass : MyClass
{
}

public class MyOtherGenericClass<T> : IMyInterface<T> where T : MyOtherClass
{
    T PropertyOfMyClass
    {
        get { ... }
    }
}