1 回答
TA贡献1810条经验 获得超4个赞
知道这条消息真正告诉我什么吗?
首先,了解隐藏的含义。暂时忘记这是一个事件的事实。如果我们有:
class B { public void M() { Console.WriteLine("B.M()"); } }
class D : B { public void M() { Console.WriteLine("D.M()"); } }
那么我们有两个方法都称为 M。如果你说:
D d = new D();
B b = d;
d.M(); // D.M();
b.M(); // B.M();
编译器警告你有两种方法,而不是一种,你得到哪一种取决于接收器的编译时类型,而不是接收器的运行时类型。
为什么这可能不是你想要的?
三个原因。
首先,许多 C# 程序员是从 Java 转到 C# 的,Java 中的方法会自动重写。在 C# 中,方法必须virtual被覆盖。编译器告诉你,你没有得到你可能期望的语义。
其次,这是为了缓解脆弱的基类问题。假设 B 的作者给 D 团队一个 DLL 程序集,其中包含 B 而没有 M,D 从中派生,添加方法 DM 那么 B 团队意识到他们可以实现 M,所以他们将它添加到 B 并给 D 团队一个新的部件。现在应该警告 D 团队 BM 存在,以便他们可以决定是否删除 DM。
第三,你为什么要这样做?如果基类已经有你想要的事件,就使用它吧!不要用旧的做新的;只用旧的。编译器告诉你,你肯定在做一些奇怪而且可能是错误的事情。
如果您打算让两个成员位于两个不同的类中,其中一个隐藏另一个,您可以通过放置new成员告诉编译器“我已经考虑过这个,这是故意的”。那就是“这是一个新成员,我的意思是让它成为一个新成员,而不是覆盖旧成员”。
- 1 回答
- 0 关注
- 84 浏览
添加回答
举报