扩展和重写方法

virtual 虚方法:在基类中提供一个默认实现,但允许子类选择性的重写它
abstract 抽象方法:基类中不能有具体实现,子类必须实现

虚拟成员或抽象成员不能是私有的,不能使用private关键字(编辑器会提示的,所以不必担心)

使用 virtualabstract 关键字

当你提供一个方法的默认实现,并允许子类选择性地重写它时,可以使用 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(); // 将输出: BaseClass DoWork \n DerivedClass DoWork
obj.DoSpecificWork(); // 将输出: DerivedClass DoSpecificWork
}
}

扩展和重写方法
https://newztx.github.io/2024/07/24/扩展和重写方法/
作者
Cranky Dove
发布于
2024年7月24日
许可协议