新vs覆盖关键字

时间:2013-12-13 22:54:03

标签: c# polymorphism override

我有一个关于多态方法的问题。我有两个类:带有非虚方法Foo( )的基类调用其虚方法Foo (int i)(如下:Foo() {Foo(1);})和覆盖方法{{1}的派生类}}

如果我调用派生类实例的Foo(int i)方法,则演练如下:Foo()。但是,如果我将覆盖方法更改为新的,则演练如下所示:base Foo() -> override Foo(int i)。它甚至没有使用新的base Foo -> base Foo(int i)方法。请解释这些方法的顺序以及它的原因。

Foo(int i)

/////////////////////////////////////////////// ///////////////////////

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
    }
}

2 个答案:

答案 0 :(得分:7)

(使用new时。)

  

它甚至没有达到新的Foo(int i)方法。

是的,但它会执行BaseClass的{​​{1}}实现,因为它在派生类中不是重写。这就是Foo(int)的全部要点 - 它说,“我没有覆盖基类方法 - 我是一个全新的方法。”如果要覆盖基类方法,请使用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) 时:

override

答案 1 :(得分:1)

你可能想看看这个: http://msdn.microsoft.com/en-us/library/ms173153.aspx

从以下开始:

  

在C#中,派生类中的方法可以与方法具有相同的名称   在基类中。您可以使用指定方法的交互方式   new和override关键字。覆盖修改器扩展了基础   class方法,并且new修饰符隐藏它。不同的是   在本主题的示例中说明。

此行为是设计使然。