在 C# 中,派生类可以包含与基类方法同名的方法。
- 基类方法必须定义为 virtual。
- 如果派生类中的方法前面没有 new 或 override 关键字,则编译器将发出警告,该方法将有如存在 new 关键字一样执行操作。
- 如果派生类中的方法前面带有 new 关键字,则该方法被定义为独立于基类中的方法。
- 如果派生类中的方法前面带有 override 关键字,则派生类的对象将调用该方法,而不是调用基类方法。
- 可以从派生类中使用 base 关键字调用基类方法。
- override、virtual 和 new 关键字还可以用于属性、索引器和事件中。
using System; using System.Collections.Generic; public class Car { public virtual void DescribeCar() { Console.WriteLine("Base Car!"); } } public class ConvertibleCar : Car { public new void DescribeCar() { base.DescribeCar(); Console.WriteLine("Convertible Car!"); } } public class DerivedConvertibleCar : ConvertibleCar { public new void DescribeCar() { base.DescribeCar(); Console.WriteLine("DerivedConvertibleCar Car!"); } } public class DerivedMinivan : Minivan { public override void DescribeCar() { base.DescribeCar(); Console.WriteLine("DerivedMinivan Car!"); } } public class Minivan : Car { public override void DescribeCar() { base.DescribeCar(); Console.WriteLine("Minivan Car!"); } } public class CarCollections { public static void Main() { List cars = new List (); cars.Add(new Car()); cars.Add(new ConvertibleCar()); cars.Add(new Minivan()); cars.Add(new DerivedConvertibleCar()); cars.Add(new DerivedMinivan()); foreach (Car car in cars) car.DescribeCar(); } }
输出结果:
Base Car!【Car】
Base Car!【ConvertibleCar】
Base Car!
Minivan Car!【Minivan】
Base Car!【DerivedConvertibleCar】
Base Car!
Minivan Car!
DerivedMinivan Car!【DerivedMinivan 】
可以看到使用new和使用override的效果是不一样的。