了解使用 Override 和 New 關鍵字的時機 (C# 程式設計手冊)
更新:2007 年 11 月
C# 可讓衍生類別中的方法與基底類別中的方法有相同的名稱,但前提是您要明確指定如何處理新方法。下列程式碼範例示範 new 和 override 關鍵字的用法。
首先宣告三個類別:名為 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 物件則是會正確呼叫覆寫方法,產生預期的結果。
如果您要強制執行規則,規定衍生自 Car 的所有類別都必須實作 DescribeCar 方法,就應建立新的基底類別,將方法 DescribeCar 定義為 abstract。抽象方法不包含任何程式碼,只有方法簽章。任何衍生自這個基底類別的類別都必須提供 DescribeCar 的實作。如需詳細資訊,請參閱抽象。