师父(父类)觉得这一招可能会被徒弟改进,就把它标记为 virtual(虚招)。
徒弟(子类)如果想改进,就用 override(重写)覆盖掉师父的招式。
class Swordsman // 师父
{
// 虚方法:允许徒弟修改
public virtual void Attack()
{
Console.WriteLine("平平无奇的一剑...");
}
}
class Linghu : Swordsman // 徒弟
{
// 重写:这一招我要自己发挥!
public override void Attack()
{
Console.WriteLine("独孤九剑!破剑式!");
}
}
当我们面对一群 Swordsman 时,不管他具体是哪个门派的,只管喊“打”!
Swordsman s1 = new Swordsman();
Swordsman s2 = new Linghu(); // 父类引用指向子类对象!
s1.Attack(); // 输出:平平无奇的一剑...
s2.Attack(); // 输出:独孤九剑!破剑式! (自动调用了子类的实现)
virtual,徒弟是不能 override 的!
new 关键字来隐藏师父的招式(虽然不推荐,但也是一种手段)。
创建一个 Animal 类,有 virtual void Speak()。
创建 Dog 和 Cat 类,重写 Speak 分别输出 "汪汪" 和 "喵喵"。
把它们都装进一个 Animal[] 数组,循环调用 Speak()。
Animal[] zoo = { new Dog(), new Cat() };
foreach (Animal a in zoo)
{
a.Speak(); // 自动变成了汪汪或喵喵
}