是什么原因导致不允许派生类的具体属性实现接口的接口属性?

时间:2011-12-29 22:49:18

标签: c# .net

这是一个非常简单的例子。

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.SomePropertyProgram.MyClass.SomeProperty无法实现Program.IMyInterface.SomeProperty,因为它没有匹配的返回类型Program.IMyInterfaceProperty

2 个答案:

答案 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}}。