了解何时使用 Override 和 New 关键字 (C#)

了解何时使用 Override New 关键字(C# 编程指南) 

C# 允许派生类中的方法与基类中的方法具有相同的名称,只要您非常明确应如何处理新方法。下面的示例演示 new override 关键字的使用。

首先声明三个类:一个名为Car类以及从该基类派生的两个类ConvertibleCarMinivan。基类包含一个可将有关汽车的描述发送到控制台的方法 (DescribeCar)。派生类方法也包含一个名为DescribeCar的方法,该方法显示派生类的独特属性。这些方法还调用基类的DescribeCar方法来演示从Car类继承属性的方式。

为了强调区别,ConvertibleCar类使用 new关键字来定义,而Minivan类使用 override来定义。

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."); } }

现在可以编写一些代码来声明这些类的实例,并调用它们的方法以便对象能够描述其自身:

C#

复制代码

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对象正确地调用重写方法,并产生预期的结果。

若要强制一个规则,要求从Car派生的所有类都必须实现DescribeCar方法,则应创建一个新的基类,将方法DescribeCar定义为 abstract。抽象方法不包含任何代码,仅包含方法签名。从此基类派生的任何类都必须提供DescribeCar的实现。有关更多信息,请参见抽象
posted on 2007-11-11 12:05  osccur123  阅读(119)  评论(0)    收藏  举报