1

回到 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(默认行为)而忽略我已经实现的行为?

4

2 回答 2

1

基于,它只是“良好的编码”。它将抑制您将获得“隐藏”方法的警告,但不应更改函数的工作方式。

于 2016-02-09T17:45:09.950 回答
1

基本上,“new”关键字强制编译器/运行时将分配给 value/actor 别名的肉体视为,顾名思义:new。想想一个新引入的可选关键字“旧”或“继承”来标记相反的内容。

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

现在,继承类 B (BB)、C (CC)、D (DD),并分别询问 a 的值。尝试!

“新”事物是新事物,不会继承。使用“虚拟”、“覆盖”等来模仿 C++ 行为。

但请记住,继承通常是一件坏事。C# 不支持合并继承是有原因的。(B:A;C:A;D:B、C)

于 2016-02-09T18:06:45.927 回答