【发布时间】:2016-02-09 17:38:47
【问题描述】:
很快回到 CS101。我正在尝试在类ConcurrentDictionary 中扩展方法Add 的行为。由于它不是virtual 或abstract,我不必用override 关键字标记它,我可以简单地在我的子类中创建一个具有相同签名的新函数。
虽然当我这样做时,我注意到一条视觉工作室消息说
如果要隐藏,请使用新关键字。
当从子类的实例调用时,使用这个关键字会改变方法的执行方式吗?
例如在下面的代码中,如果我有一个 MyClassEx 类的实例并且我调用 Method1 那么超类中的 Method1 将不会被正确调用(只有当我自己调用它时base)?。对于同样的实例,如果我调用Method2 会发生同样的结果,只有子类的Method2 会执行?
public class MyClass
{
public void Method1() { Console.Out.WriteLine("MyClass.Method1"); }
public void Method2() { Console.Out.WriteLine("MyClass.Method2"); }
}
public class MyClassEx : MyClass
{
public void Method1()
{
Console.Out.WriteLine("MyClassEx.Method1");
//base.Method1();
}
public new void Method2()
{
Console.Out.WriteLine("MyClassEx.Method2");
//base.Method2();
}
}
以这种方式使用new关键字只是“良好的编码”还是有一些效果?
编辑:看起来这只是“良好的编码”。虽然它引起了轻微的担忧。我希望在子类中创建一个新的Add 方法来改变ConcurrentDictionary 方法的行为。尽管从链接的答案看来,另一个编码员可以通过简单地引用超类的子类来绕过我的新实现。
MyClassEx mycex = new MyClassEx();
((MyClass)mycex).Method2();
在这种情况下,他们可以调用超类的Method2(默认行为)而忽略我已经实现的行为?
【问题讨论】:
-
这里是documentation 和hiding 的一些信息
标签: c# overriding method-hiding