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}";
}