第二十三式:C# 多态性 (万剑归宗)

绝世
秘籍
冲儿,同一招“黑虎掏心”,少林弟子使出来刚猛有力,武当弟子使出来却绵里藏针。
同一个招式名,不同的门派有不同的打法,这就叫多态性 (Polymorphism)
意思是,我喊一声“出剑”,大家虽然都拔剑,但姿势各不相同?

1. 虚方法与重写 (Virtual & Override) - 改良剑法

师父(父类)觉得这一招可能会被徒弟改进,就把它标记为 virtual(虚招)。

徒弟(子类)如果想改进,就用 override(重写)覆盖掉师父的招式。


class Swordsman // 师父
{
    // 虚方法:允许徒弟修改
    public virtual void Attack()
    {
        Console.WriteLine("平平无奇的一剑...");
    }
}

class Linghu : Swordsman // 徒弟
{
    // 重写:这一招我要自己发挥!
    public override void Attack()
    {
        Console.WriteLine("独孤九剑!破剑式!");
    }
}
        

2. 多态的威力 - 见招拆招

当我们面对一群 Swordsman 时,不管他具体是哪个门派的,只管喊“打”!


Swordsman s1 = new Swordsman();
Swordsman s2 = new Linghu(); // 父类引用指向子类对象!

s1.Attack(); // 输出:平平无奇的一剑...
s2.Attack(); // 输出:独孤九剑!破剑式! (自动调用了子类的实现)
        
注意!如果师父没有说 virtual,徒弟是不能 override 的!
那是欺师灭祖!除非你用 new 关键字来隐藏师父的招式(虽然不推荐,但也是一种手段)。
🎭

动手时刻:百家争鸣

创建一个 Animal 类,有 virtual void Speak()

创建 DogCat 类,重写 Speak 分别输出 "汪汪" 和 "喵喵"。

把它们都装进一个 Animal[] 数组,循环调用 Speak()

查看参考答案

Animal[] zoo = { new Dog(), new Cat() };

foreach (Animal a in zoo)
{
    a.Speak(); // 自动变成了汪汪或喵喵
}
                    

成就解锁:【千面人】 获得:易容面具