在创建与超类中具有相同签名的方法时使用 new 关键字?

Using the new keyword when creating a method with the same signature as one in the superclass?

回到 CS101 真快。我正在尝试扩展 class ConcurrentDictionary 中方法 Add 的行为。由于它不是 virtualabstract 我不必用 override 关键字标记它,我可以简单地在我的 subclass 中创建一个新函数同一个签名。

虽然当我这样做时我注意到 visual studio 消息说

Use the new keyword if hiding was intended.

使用此关键字是否会改变从子实例调用时方法的执行方式class?

例如在下面的代码中,如果我有一个 class MyClassEx 的实例并且我调用 Method1 然后 Method1 在超级 class 不会被称为正确的(只有当我自己用 base 调用它时)?。对于同一个实例,如果我调用 Method2 会发生相同的结果,只有子 class 的 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 关键字只是 "good coding" 还是有一些效果?

编辑: 从它的外观来看,这只是 "good coding"。尽管它引起了轻微的担忧。我希望在 subclass 中创建一个新的 Add 方法来改变 ConcurrentDictionary 方法的行为。尽管从链接的答案看来,另一个编码器似乎可以通过简单地引用超级 class 中的子 class 来绕过我的新实现。

MyClassEx mycex = new MyClassEx();
((MyClass)mycex).Method2();

在这种情况下,他们可以调用 superclass 的 Method2(默认行为)而忽略我已经实现的行为?

基于this,就是"good coding"。它将抑制您将收到的有关 "hiding" 方法的警告,但不应更改函数的工作方式。

基本上,"new" 关键字强制 compiler/runtime 将分配给 value/actor 别名的肉体视为,顾名思义:新的。想一想新引入的可选关键字 "old" 或 "inherited" 用来标记相反的关键字。

假设,class A 定义了一个值为 42 的值别名 a。进一步假设,class B 继承自 class A。没有任何关键字,但请记住可见性,B 将通过将 42 分配给 c 来响应 "c = B.a"。现在,让我们假设,class C 也继承自 class A,但是使用 "new" 关键字覆盖了 a 的值别名,并在其构造函数中定义了 "a = 666;"。第三,class D 再次继承自 class A,并定义了 "a = 999;".

现在,继承classB(BB)、C(CC)、D(DD),分别求出a的值。试试吧!

一个"new"东西是新东西,不会继承。使用 "virtual"、"override" 等模仿 C++ 行为。

但请记住,继承通常是一件坏事。 C# 不支持合并继承是有原因的。 (乙:甲;丙:甲;丁:乙,丙)