在OO編程中經常定義某一基類中含有虛擬方法(用Virtral修飾),當子類繼承基類並根椐自己需要對基類中同名方法
進行重寫時可以有兩種選擇方式:即New 和Override;
前者表示在了類中隱藏基類中的同名方法,後者表示重寫基類中的同名方法,不管是哪一種方式子類同樣還是
可以通過base關鍵字調用基類的同名方法。爲了具體區分兩者的差別先看一個例子:
首先聲明三個類:一個名爲 Car 的基類以及從該基類派生的兩個類 ConvertibleCar 和 Minivan。基類包含一個可將有關汽車的描述發送到控制檯的方法 (DescribeCar)。派生類方法也包含一個名爲 DescribeCar 的方法,該方法顯示派生類的獨特屬性。這些方法還調用基類的 DescribeCar 方法來演示從 Car 類繼承屬性的方式。
爲了強調區別,ConvertibleCar 類使用 new 關鍵字來定義,而 Minivan 類使用 override 來定義
// Define the base class
class Car
{
public virtual void DescribeCar()
{
System.Console.WriteLine("Four wheels and an engine.");
}
}
// Define the derived classes
class ConvertibleCar : Car
{
public new virtual void DescribeCar()
{
base.DescribeCar();
System.Console.WriteLine("A roof that opens up.");
}
}
class Minivan : Car
{
public override void DescribeCar()
{
base.DescribeCar();
System.Console.WriteLine("Carries seven people.");
}
}
public static void TestCars1()
{
Car car1 = new Car();
car1.DescribeCar();
System.Console.WriteLine("----------");
ConvertibleCar car2 = new ConvertibleCar();
car2.DescribeCar();
System.Console.WriteLine("----------");
Minivan car3 = new Minivan();
car3.DescribeCar();
System.Console.WriteLine("----------");
}
正如預期的那樣,輸出類似如下所示:
Four wheels and an engine.
----------
Four wheels and an engine.
A roof that opens up.
----------
Four wheels and an engine.
Carries seven people.
----------
但是,在該代碼接下來的一節中,我們聲明瞭一個從 Car 基類派生的對象的數組。此數組能夠存儲 Car、ConvertibleCar 和 Minivan 對象。該數組的聲明類似如下所示:
public static void TestCars2()
{
Car[] cars = new Car[3];
cars[0] = new Car();
cars[1] = new ConvertibleCar();
cars[2] = new Minivan();
}
然後可以使用一個 foreach 循環來訪問該數組中包含的每個 Car 對象,並調用 DescribeCar 方法,如下所示:
foreach (Car vehicle in cars)
{
System.Console.WriteLine("Car object: " + vehicle.GetType());
vehicle.DescribeCar();
System.Console.WriteLine("----------");
}
此循環的輸出如下所示:
Car object: YourApplication.Car
Four wheels and an engine.
----------
Car object: YourApplication.ConvertibleCar
Four wheels and an engine.
----------
Car object: YourApplication.Minivan
Four wheels and an engine.
Carries seven people.
----------
注意,ConvertibleCar 說明與您的預期不同。由於使用了 new 關鍵字來定義此方法,所調用的不是派生類方法,而是基類方法。Minivan 對象正確地調用重寫方法,併產生預期的結果。
通過上面的輸出結果可以明白的看到當基類中的虛方法有方法體時,當定義基類類型的對象調用方法時,子類
中用New關鍵字進行實現的調用的方法實際上是基類的同名方案並非子類本身的同名方法,而Override則不然。