深入理解方法声明中“virtual override”和“new”关键字的区别
面向对象编程中,方法重写允许子类为其父类中定义的方法提供自己的实现。这使得代码能够实现定制和多态性。然而,“virtual”和“override”关键字组合声明基类型中的方法,以及在子类型中使用“new”关键字,两者之间存在细微差别。
“virtual override”
当基类型中声明的方法为“virtual”时,它表示其子类可以重写该方法。因此,当子类使用“override”关键字重写方法时,它实际上替换了基类中的实现。
“new”
相反,当子类中声明的方法为“new”时,它会创建一个与基类中方法同名的新方法。子类方法不会重写基类方法;它独立运行。
行为差异
“virtual override”和“new”的主要区别在于它们对运行时行为的影响。考虑以下示例:
<code class="language-csharp">public class BaseClass { public virtual bool DoSomething() { return false; } } public class DerivedClass : BaseClass { public override bool DoSomething() { return true; } } // ... BaseClass obj = new DerivedClass(); obj.DoSomething(); // 返回 true (重写后的实现)</code>
如果我们在DerivedClass
中使用“new”而不是“override”,则会导致一个不同的方法来隐藏基类方法。在这种情况下:
<code class="language-csharp">//... DerivedClass obj = new DerivedClass(); obj.DoSomething(); // 返回 false (基类实现)</code>
继承和多态性
使用“virtual override”时,子类方法可以访问和修改父类提供的实现。这允许灵活的继承和多态性。相反,“new”完全替换了基类方法,从而破坏了继承链。
虚拟调度表 (VDT)
在 C# 中,虚拟方法存储在虚拟调度表 (VDT) 中。调用虚拟方法时,根据运行时实际对象的类型确定合适的实现。这使得多态性成为可能。但是,“new”方法不包含在 VDT 中,从而阻止了动态方法选择。
结论
“virtual override”允许重写基类方法以实现继承和多态性,而“new”在子类中创建独立的方法。理解这两个关键字之间的区别对于有效地重写方法和设计灵活的面向对象代码至关重要。
以上是C#方法覆盖中的'虚拟覆盖”和'新”关键字有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!