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
启动了一个新方法。