Skip to content

.NET Core 实战 [No.77] 彻底替换基类的成员

🏷️ 《.NET Core 实战》

使用 override 关键字可以重写基类成员,这是对基类成员的扩展。如要彻底替换基类成员则需要使用 new 关键字。

csharp
// 基类方法
public void Run()
// 派生类替换
public new void Run()

替换成员一般应用于:派生类的成员名称、参数、返回值类型与基类的相同,但是在功能上完全不同的情形。

下面是示例代码。我在书中示例的基础上添加了一个重写成员以作对比。

CheckTask.cs

csharp
class CheckTask
{
    public void Run(int max)
    {
        Console.WriteLine($"最大执行任务数:{max}");
    }

    public virtual void Output()
    {
        Console.WriteLine($"基类的方法被调用。");
    }
}

DRCheckTask.cs

csharp
class DRCheckTask : CheckTask
{
    public new void Run(int max)
    {
        Console.WriteLine($"并行任务数:{max}");
    }

    public override void Output()
    {
        Console.WriteLine($"派生类的方法被调用。");
    }
}

测试代码:

csharp
CheckTask t1 = new CheckTask();
t1.Run(15); // 最大执行任务数:15

DRCheckTask t2 = new DRCheckTask();
t2.Run(10); // 并行任务数:10
(t2 as CheckTask).Run(5); // 最大执行任务数:5

t1.Output(); // 基类的方法被调用。
t2.Output(); // 派生类的方法被调用。
(t2 as CheckTask).Output(); // 派生类的方法被调用。

执行结果:

可以发现派生类转换成基类后调用重写方法和替换方法时有明显的不同:

  • 重写方法仍然调用的是派生类的方法
  • 替换方法调用的则是基类的方法

参考:《.NET Core 实战:手把手教你掌握 380 个精彩案例》 -- 周家安 著