这是一个非常简单的例子。
public interface IMyInterfaceProperty
{
}
public class MyProperty : IMyInterfaceProperty
{
}
public interface IMyInterface
{
IMyInterfaceProperty SomeProperty { get; set; }
}
public class MyClass : IMyInterface
{
public MyProperty SomeProperty { get; set; }
}
在此示例中,MyProperty
派生自IMyInterfaceProperty
但不允许。不允许编译的思考过程是什么?
Program.MyClass
未实现接口成员Program.IMyInterface.SomeProperty
。 Program.MyClass.SomeProperty
无法实现Program.IMyInterface.SomeProperty
,因为它没有匹配的返回类型Program.IMyInterfaceProperty
。
答案 0 :(得分:4)
即使以下情况也是不允许的:
public interface IMyInterface
{
IMyInterfaceProperty SomeProperty { get; set; }
MyProperty SomeProperty { get; set; }
}
我认为原因是该类型中不允许具有相同签名的成员。这里不考虑返回值:
方法的签名特别不包括退货 类型,也不包括可以指定的params修饰符 最右边的参数。
(来自http://msdn.microsoft.com/en-us/library/aa691131(v=vs.71).aspx。虽然是针对VS2003,但我认为自那时以来没有改变:))
答案 1 :(得分:3)
因为它不是类型安全的。
如果MyClass
实现IMyInterface
,那么MyClass
的实例需要能够使用IMyInterface
变量(Liskov替换原则)。让我们看看这意味着什么:
除了您定义的类型之外,我们还假设:
public class EvilProperty : IMyInterfaceProperty {}
public static class X
{
public static void EvilMethod(IMyInterface a, IMyInterfaceProperty b)
{
a.SomeProperty = b;
}
}
现在,这是电话(支撑自己!):
X.EvilMethod(new MyClass(), new EvilProperty());
看看会发生什么?该方法会将EvilProperty
的实例分配给MyClass
实例的SomeProperty
,但该属性需要MyProperty
,而EvilProperty
不会继承MyProperty
1}}。