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

摘要:[C#] 瞭解使用 Override 和 New 關鍵字的時機 (C# 程式設計手冊)

C#

 
// 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 基底類別的物件陣列。這個陣列可以存放 CarConvertibleCarMinivan 物件。陣列宣告如下:

 

 C#

 
public static void TestCars2()
{
    Car[] cars = new Car[3];
    cars[0] = new Car();
    cars[1] = new ConvertibleCar();
    cars[2] = new Minivan();
}
 

接著可以使用 foreach 迴圈探尋陣列中所包含的每一個 Car 物件,並呼叫 DescribeCar 方法,如下所示:

 

 

C#
 
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 物件則是會正確呼叫覆寫方法,產生預期的結果。

文章轉自: http://msdn.microsoft.com/zh-tw/library/ms173153(VS.80).aspx