多態是指同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。
多態建立在類的繼承之上:
- 類成員的 “橫向拓展” (類成員越來越多)
- 類成員的 “縱向拓展” (類的行為改變,類的成員的 “版本升高”)
- 類成員的隱藏 (new 關鍵字)——不常用,因為理解復雜且容易出錯
- 類成員的重寫 (override 關鍵字)
- 重寫和隱藏發生的條件:函數或屬性成員一致,擁有可見性(如父類的是private,那肯定不能重寫了),函數或屬性簽名需要一致(方法名,參數類型,返回類型)
多態:
基於類的重寫機制(virtual-override):函數成員的具體行為(版本)由引用的對象決定
class Program { static void Main(string[] args) { Person person = new Person(); person.Show(); Person teacher = new Teacher(); teacher.Show(); //子類方法版本被隱藏 則找尋上一個版本 Person doctor = new Doctor(); doctor.Show(); } } class Person { public virtual void Show() { Console.WriteLine("I am Person"); } } class Teacher : Person { public override void Show() { Console.WriteLine("I am Teacher"); } } class Doctor : Teacher { //在多態狀態時 隱藏改方法 public new void Show() { Console.WriteLine("I am Teacher"); } }
基於接口的多態機制:接口的行為由它決定的接口實現
class Program { static void Main(string[] args) { IPerson person = new Person(); person.Show(); IPerson teacher = new Teacher(); teacher.Show(); } } interface IPerson { public void Show(); } class Person : IPerson { public void Show() { Console.WriteLine("I am Person"); } } class Teacher : IPerson { public void Show() { Console.WriteLine("I am Teacher"); } }