override 是多态,new 是隐藏

同样通过基类变量调用方法,override 会按运行时类型分派;new 只隐藏成员,不参与多态重写。

运行行为

new 隐藏

Speaker hidden = new HiddenSpeaker()
hidden.Say() -> Speaker

override 重写

Speaker overridden = new LoudSpeaker()
overridden.Say() -> LoudSpeaker override

abstract

Storage 规定 Save
FileStorage / DbStorage 必须实现

sealed override

Car 重写并封住 Drive
后续子类不能再 override
要让基类引用根据真实对象调用子类实现,使用 virtual + override。

对应代码

public class Speaker
{
    public virtual string Say() => "Speaker";
}

public sealed class HiddenSpeaker : Speaker
{
    public new string Say() => "HiddenSpeaker new";
}

public sealed class LoudSpeaker : Speaker
{
    public override string Say() => "LoudSpeaker override";
}

public abstract class Storage
{
    public abstract string Save(string data);
    public virtual string Prefix => "";
    public string SaveWithPrefix(string data) => Save(Prefix + data);
}

public sealed class DbStorage : Storage
{
    public override string Prefix => "DB:";
    public override string Save(string data) => $"[Db] {data}";
}