新关键字:为什么不调用派生方法?

升压

我有简单的三个类:

class A
{
    public virtual void Write()
    {
        Console.Write("A");
    }
}

class B:A
{
    public override void Write()
    {
        Console.Write("B");
    }
}

class C : B
{
    public new void Write()
    {
        Console.Write("C");
    }
}

我正在创建对象并调用其方法:

A a = new A();
a.Write();

A b = new C();
b.Write();

C c = new C();
c.Write();

输出将是: ABC

我不明白的是为什么这些代码会产生B

A b = new C();
b.Write();

我认为应该C但是,我测试了很多次,并且始终如此B

我知道会A b = new C()创建C的新对象类型。因此输出应为C。还是在不使用强制转换的情况下调用覆盖方法是一种特殊的行为?

为什么会发生?由于我们没有使用任何对B类的引用

亚历山大·德克

如果您使用它会工作 ((C)b).Write();

使用new关键字,您不会覆盖WriteC方法,而是创建仅为C定义的新方法。因此,对于您的C,您实际上有2个带有方法名称的方法Write

A c = new C();

c.Write();          //Output "B", you're calling the overridden method    
((C)c).Write();     //Output "C", you're calling the method defined on C

//or

(c as C).Write();

将c定义为时,也会发生相同的情况C

C c = new C();

c.Write();          //Output "C"    
((A)c).Write();     //Output "B"

在第一个示例中,您正在调用C上定义的新方法。在第二行中,您Write从A中调用了该方法,该方法被B覆盖,因此输出"B"

编辑:(更多解释)

变量c的类型为A,因此您的编译器知道“ c是A的实例”,但实际上它不是派生类型。当您Write在其上调用方法时,它将调用在A(由B覆盖)上定义的方法。基类A不了解在C上定义的新方法(即new会创建一个新方法),因此,除非将其强制转换为C以使编译器知道c基方法的实际派生类型,否则它不知道类将被调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在调用函数时使用`go`关键字?

为什么我必须通过新关键字?

为什么新关键字返回指针而不是引用?

为什么需要使用 await 关键字来调用异步方法

为什么伯爵()方法使用“检查”的关键字?

为什么“ of”不是JavaScript关键字?

为什么“ this”关键字也引用子类?

更好的结构/新关键字方法

为什么类定义的metaclass关键字参数接受可调用对象?

为什么在 Kivy 中调用“root”关键字时会受到不同的对待?

在DLL中调用函数时,为什么需要“ ref”关键字?

为什么将新关键字视为Java中的高耦合?

为什么字符串不需要新的关键字

为什么不使用关键字“ new”创建新的Random

为什么建模UNTIL / REPEAT的代码需要新的关键字?

为什么 $this 关键字会给出静态的致命错误,但(新自我)工作正常

为什么函数不返回带有可替换关键字的新行?

为什么Dart中没有await关键字的async关键字功能?

为什么 C++ 中的关键字 struct 与 C 中的关键字 struct 不同?

为什么__debug__是关键字时不在关键字列表中?

没有await关键字的调用async方法到底会发生什么?

为什么'this'关键字在javascript中的对象的速记方法中不起作用?

为什么用关键字将其与静态方法一起使用?

为什么在Scala中将match作为关键字而不是方法来实现?

为什么我们不能在静态方法中使用'this'关键字

为什么在可运行接口中运行用abstract关键字定义的方法

为什么带有参数的类的方法需要“ Call”关键字?

为什么带有 await 关键字的异步方法仍然阻塞主线程?

为什么这会在实例方法声明中显示“预期的 'func' 关键字”