我有一个关于多态方法的问题。我有两个类:带有非虚方法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
}
}
答案 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修饰符隐藏它。不同的是 在本主题的示例中说明。
此行为是设计使然。