Share via


了解使用 Override 和 New 關鍵字的時機 (C# 程式設計手冊)

更新:2007 年 11 月

C# 可讓衍生類別中的方法與基底類別中的方法有相同的名稱,但前提是您要明確指定如何處理新方法。下列程式碼範例示範 newoverride 關鍵字的用法。

首先宣告三個類別:名為 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 的實作。如需詳細資訊,請參閱抽象

請參閱

概念

C# 程式設計手冊

參考

類別和結構 (C# 程式設計手冊)

使用 Override 和 New 關鍵字進行版本控制 (C# 程式設計手冊)