首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#:通过显式指定接口进行属性重写

C#:通过显式指定接口进行属性重写
EN

Stack Overflow用户
提问于 2010-09-14 08:11:08
回答 1查看 7K关注 0票数 17

在尝试覆盖来自Collection<T>类的ICollection<T>.IsReadOnly属性的显式接口实现时,我遇到了一些文档,指出显式接口成员实现不能被覆盖,因为它们不能具有virtualabstract等修饰符。在MSDN上,它们甚至指定如何通过创建另一个由显式接口成员实现调用的抽象或虚拟成员来使显式接口成员实现可用于继承。到目前为止还没有问题。

但随后我想知道:为什么在C#中可以仅通过指定接口显式实现的接口成员

例如,假设我有一个简单的接口,如下所示,具有属性和方法:

代码语言:javascript
运行
复制
public interface IMyInterface
{
    bool AlwaysFalse { get; }
    bool IsTrue(bool value);
}

还有一个显式实现接口的类A,它有一个方法Test(),它调用自己的接口成员实现。

代码语言:javascript
运行
复制
public class A : IMyInterface
{
    bool IMyInterface.AlwaysFalse
    { get { return false; } }

    bool IMyInterface.IsTrue(bool value)
    { return value; }

    public bool Test()
    { return ((IMyInterface)this).AlwaysFalse; }
}

正如您所看到的,四个成员都不是虚拟的或抽象的,所以当我像这样定义一个类B时:

代码语言:javascript
运行
复制
public class B : A
{
    public bool AlwaysFalse
    { get { return true; } }

    public bool IsTrue(bool value)
    { return !value; }
}

然后,您会期望将B强制转换为A的实例的行为类似于A。它确实做到了:

代码语言:javascript
运行
复制
A a = new A();
Console.WriteLine(((IMyInterface)a).AlwaysFalse);    // False
Console.WriteLine(((IMyInterface)a).IsTrue(false));  // False
Console.WriteLine(a.Test());                         // False
A b = new B();
Console.WriteLine(((IMyInterface)b).AlwaysFalse);    // False
Console.WriteLine(((IMyInterface)b).IsTrue(false));  // False
Console.WriteLine(b.Test());                         // False

现在问题来了。创建一个与B完全相同的类C,除了类声明中的一件事:

代码语言:javascript
运行
复制
public class C : A, IMyInterface
{ /* ... same as B ... */ }

现在,当强制转换为A时,C的一个实例的行为不像A,而像C

代码语言:javascript
运行
复制
A c = new C();
Console.WriteLine(((IMyInterface)c).AlwaysFalse);    // True
Console.WriteLine(((IMyInterface)c).IsTrue(false));  // True
Console.WriteLine(c.Test());                         // True

现在,在C中甚至连Test()方法都会调用被覆盖的方法!为什么会这样呢?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3705308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档