在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的方法。但显然确实如此,不是吗?
答案 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 { ... }
}
}