C# 新的vs覆盖关键字
我有一个关于多态方法的问题。我有两个类:带有非虚方法C# 新的vs覆盖关键字,c#,polymorphism,overriding,C#,Polymorphism,Overriding,我有一个关于多态方法的问题。我有两个类:带有非虚方法Foo()的基类和重写方法Foo(inti)的派生类 如果调用派生类实例的Foo()方法,则演练如下:base Foo()->override Foo(int I)。但如果我将override方法更改为new,则演练如下:base Foo->base Foo(inti)。它甚至没有使用新的Foo(inti)方法。请解释一下这些方法的顺序以及为什么是这样 using System; class Program { sealed void
Foo()
的基类和重写方法Foo(inti)
的派生类
如果调用派生类实例的Foo()
方法,则演练如下:base Foo()->override Foo(int I)
。但如果我将override方法更改为new,则演练如下:base Foo->base Foo(inti)
。它甚至没有使用新的Foo(inti)
方法。请解释一下这些方法的顺序以及为什么是这样
using System;
class Program
{
sealed void Main()
{
DerivedClass d = new DerivedClass();
//Goes to BaseClass Foo() method
//then goes to Derived Foo(int i ) method
d.Foo();
}
}
class BaseClass
{
public void Foo() { Foo(1); }
public virtual void Foo(int i) { // do something;
}
}
class DerivedClass : BaseClass
{
public override void Foo(int i) { //Do something
}
}
//////////////////////////////////////////////////////////////////////
using System;
class Program
{
sealed void Main()
{
DerivedClass d = new DerivedClass();
//Goes to BaseClass Foo() method
//then goes to base Foo(int i) method
//never gets to Foo(int i) of the derived class
d.Foo();
}
}
class BaseClass
{
public void Foo() { Foo(1); }
public virtual void Foo(int i) { // do something;
}
}
class DerivedClass : BaseClass
{
public new void Foo(int i) { //Do something
}
}
(使用新建时
)
它甚至没有使用新的Foo(inti)方法
是的,它执行Foo(int)
的BaseClass
实现,因为它在派生类中没有被重写。这就是new
的全部要点,它的意思是,“我不是重写基类方法-我是一个全新的方法。”如果要重写基类方法,请使用override
。线索在关键字中:)
例如,当使用new
时:
BaseClass x = new DerivedClass();
x.Foo(1); // Calls BaseClass.Foo(int)
DerivedClass y = new DerivedClass();
y.Foo(1); // Calls DerivedClass.Foo(int)
但是当使用覆盖时
:
BaseClass x = new DerivedClass();
x.Foo(1); // Calls DerivedClass.Foo(int) // Due to overriding
DerivedClass y = new DerivedClass();
y.Foo(1); // Calls DerivedClass.Foo(int)
(使用新建时
)
它甚至没有使用新的Foo(inti)方法
是的,它执行Foo(int)
的BaseClass
实现,因为它在派生类中没有被重写。这就是new
的全部要点,它的意思是,“我不是重写基类方法-我是一个全新的方法。”如果要重写基类方法,请使用override
。线索在关键字中:)
例如,当使用new
时:
BaseClass x = new DerivedClass();
x.Foo(1); // Calls BaseClass.Foo(int)
DerivedClass y = new DerivedClass();
y.Foo(1); // Calls DerivedClass.Foo(int)
但是当使用覆盖时
:
BaseClass x = new DerivedClass();
x.Foo(1); // Calls DerivedClass.Foo(int) // Due to overriding
DerivedClass y = new DerivedClass();
y.Foo(1); // Calls DerivedClass.Foo(int)
您可能需要查看以下内容: 其开头如下: 在C#中,派生类中的方法可以与方法同名 在基类中。您可以通过使用指定方法的交互方式 新建和覆盖关键字。“覆盖”修改器扩展了基础 类方法,新的修改器将其隐藏。区别在于 如本主题中的示例所示
此行为是设计的。您可能需要查看以下内容: 其开头如下: 在C#中,派生类中的方法可以与方法同名 在基类中。您可以通过使用指定方法的交互方式 新建和覆盖关键字。“覆盖”修改器扩展了基础 类方法,新的修改器将其隐藏。区别在于 如本主题中的示例所示
这种行为是故意的。谢谢。您能建议我阅读一些关于多态性和虚拟方法表的内容,以便我能更详细地理解它吗。因为事实上,我并不完全理解这个机制。你可以试试类似或谢谢的东西。您能建议我阅读一些关于多态性和虚拟方法表的内容,以便我能更详细地理解它吗。因为实际上我并没有完全理解这个机制。你可能会尝试一些类似于或者类似于我们去基类调用虚拟方法,然后我们检查派生类是否包含重写方法,如果没有,我们实现基类虚拟方法?@user3101007:嗯,有点像。这不是“转到”基方法的问题-它只是找到该方法最派生的类型实现,而
new
启动一个新方法。这是否类似于我们转到基类并调用虚拟方法,然后检查派生类是否包含重写方法,如果它不实现基本虚拟方法?@user3101007:嗯,有点。这不是“去”基本方法的问题——它只是找到该方法最派生的类型实现,而new
启动了一个新方法。