回到 CS101 真的很快。我正在尝试扩展Add
类中方法的行为ConcurrentDictionary
。由于它不是virtual
或者abstract
我不必用override
关键字标记它,我可以简单地在我的子类中创建一个具有相同签名的新函数。
虽然当我这样做时,我注意到一条视觉工作室消息说
如果打算隐藏,请使用 new 关键字。
当从子类的实例调用时,使用 this 关键字会改变方法的执行方式吗?
例如在下面的代码中,如果我有一个类的实例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
(默认行为)而忽略我已经实现的行为?