virtual
虚方法:在基类中提供一个默认实现,但允许子类选择性的重写它
abstract
抽象方法:基类中不能有具体实现,子类必须实现
虚拟成员或抽象成员不能是私有的,不能使用private关键字(编辑器会提示的,所以不必担心)
使用 virtual
和 abstract
关键字
当你提供一个方法的默认实现,并允许子类选择性地重写它时,可以使用 virtual
关键字。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public abstract class BaseClass { public virtual void DoWork() { Console.WriteLine("BaseClass DoWork"); }
public abstract void DoSpecificWork(); }
public class DerivedClass : BaseClass { public override void DoWork() { Console.WriteLine("DerivedClass DoWork"); }
public override void DoSpecificWork() { Console.WriteLine("DerivedClass DoSpecificWork"); } }
|
派生类重写虚方法的同时,实现基类的虚方法
在 C# 中,当子类重写基类中的虚方法时,基类中的虚方法实现不会自动执行。也就是说,除非在重写的子类方法中显式调用基类的方法,基类的实现将不会执行。
你可以使用 base
关键字在重写的方法中显式调用基类的虚方法。这样可以在子类中扩展或修改基类的方法逻辑。
下面是一个示例,展示了如何在子类中重写基类的虚方法,并选择性地调用基类的实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| using System;
public abstract class BaseClass { public virtual void DoWork() { Console.WriteLine("BaseClass DoWork"); }
public abstract void DoSpecificWork(); }
public class DerivedClass : BaseClass { public override void DoWork() { base.DoWork();
Console.WriteLine("DerivedClass DoWork"); }
public override void DoSpecificWork() { Console.WriteLine("DerivedClass DoSpecificWork"); } }
class Program { static void Main() { BaseClass obj = new DerivedClass(); obj.DoWork(); obj.DoSpecificWork(); } }
|