同一操作作用於不同物件,產生不同結果。C# 多態包含:介面多態、繼承多態(虛擬方法、抽象方法)。
定義介面 IAnimal,具體類別實作介面並提供各自邏輯。
public interface IAnimal { void Eat(); }
public class Wolf : IAnimal {
public void Eat() => Console.WriteLine("狼吃肉!");
}
public class Sheep : IAnimal {
public void Eat() => Console.WriteLine("羊吃草!");
}
// 使用
new Wolf().Eat();
new Sheep().Eat();
基類用 virtual 標記,衍生類用 override 重寫。可用 sealed 防止進一步重寫。基類必須提供預設實作。
public class Animal {
public virtual void Eat() { Console.WriteLine("動物進食"); }
}
public class Wolf : Animal {
public override void Eat() {
base.Eat(); // 可選:呼叫基類實作
Console.WriteLine("狼吃肉!");
}
}
public class Goat : Sheep {
public sealed override void Eat() => Console.WriteLine("山羊吃草!"); // 封鎖重寫
}
基類為 abstract,方法僅宣告無實作。衍生類必須 override 實作,且無 base 可呼叫。抽象類不可實例化。
public abstract class Animal {
public abstract void Eat();
}
public class Wolf : Animal {
public override void Eat() => Console.WriteLine("狼吃肉!");
}
| 特性 | 虛擬方法 | 抽象方法 |
|---|---|---|
| 基類實作 | 必須提供 | 僅宣告,不實作 |
| 衍生類重寫 | 可選 | 強制 |
| 可呼叫 base | 是 | 否 |
| 基類可實例化 | 是 | 否(抽象類) |
| 介面多態需 override | 否,直接實作介面方法 | |
virtual。abstract。