C# 学习笔记(6) 多态
C# 學習筆記(6) 多態
面向對象三大特性,封裝、繼承和多態,前兩個很容易理解,但是多態就不好描述了,每個人對多態的看法可能都不一樣,個人認為多態就是通過繼承實現的不同對象調用相同方法,表現出不同行為。舉個例子,假設有一個動物類,里面有個吃東西的方法,然后貓類和人類都從動物類繼承過來吃東西這個方法,但是人和貓吃東西肯定有區別的,因此會通過種種手段,分別實現人類和貓類自己的吃東西方法。通過繼承,人和貓(不同對象)調用吃東西(相同方法),表現出不同行為(吃東西有區別)
重載
C#中允許方法名重復(方法重載),不過要求方法參數要么個數不同,要么類型不同。
//三個方法名字都叫Learn 方法1、2參數個數相同但是類型不同 方法1、3參數類型相同但是個數不同public void Learn(string subject, int time){Console.WriteLine("學習{0}科目, 學習時長:{1}", subject, time);}public void Learn(string subject1, string subject2){Console.WriteLine("學習{0}科目, 學習{1}科目", subject1, subject2);}public void Learn(string subject, int time, float ratio){Console.WriteLine("學習{0}科目, 學習時長:{1}, 學習效率:{2}", subject, time, ratio);}隱藏
重名時編譯器會提示警告,但是可以在子類重名的屬性或者方法前添加new關鍵字,這樣子類的屬性或者方法就會屏蔽掉父類的重名屬性或者方法,這時候如果想在子類中調用被屏蔽掉的父類屬性或方法,需要使用關鍵字base. 調用
class Program{static void Main(string[] args){Student student = new Student();student.Eat();Console.ReadKey();}}public class Person{public string Name;public int Age;public bool Gender;public Person(){Console.WriteLine("人類構造函數");}public Person(int age){this.Age = age;Console.WriteLine("人類構造函數 人類年紀:{0}", this.Age);}public void Eat(){Console.WriteLine("父類吃飯吃兩碗");}}class Student : Person{public Student():base(50){Console.WriteLine("子類構造函數");}public new void Eat(){Console.WriteLine("子類吃飯吃兩碗");}}-
上面代碼會輸出:
人類構造函數 人類年紀:50子類構造函數子類吃飯吃兩碗
虛方法
虛方法在父類中方法前面加關鍵字 virtual 這樣就將該方法標記為虛方法,子類如果想要重寫該虛方法,可以寫一個同名方法,在方法前加關鍵字 override ,如果不重寫該方法,則子類可以調用父類的虛方法。注意虛方法和上面的隱藏很像,但是不同的是,使用里氏轉換將子類裝進父類,然后直接調用被子類隱藏的方法,會發現調用的是父類的方法,而該方法如果被子類重寫則實際調用的是子類重寫的方法
class Program{static void Main(string[] args){//里氏轉換 子類可以放在父類對象里Person student = new Student();student.Eat();Person maleStudent = new MaleStudent();maleStudent.Eat();Console.ReadKey();}}public class Person{public string Name;public int Age;public bool Gender;public Person(){Console.WriteLine("人類構造函數");}public Person(int age){this.Age = age;Console.WriteLine("人類構造函數 人類年紀:{0}", this.Age);}public virtual void Eat(){Console.WriteLine("人類吃飯吃兩碗");}}class Student : Person{public new void Eat(){Console.WriteLine("學生吃飯吃兩碗");}}class MaleStudent : Person{public override void Eat(){Console.WriteLine("男學生吃飯吃兩碗");}}-
上面代碼會輸出:
人類構造函數 人類年紀:50子類構造函數人類吃飯吃兩碗人類構造函數男學生吃飯吃兩碗
由上面輸出可以看出 重寫和隱藏的區別 當使用子類裝進父類后,直接調用重寫的方法,該方法依然是子類的方法,而隱藏的則是父類的方法。
抽象類
當父類中的方法不知道如何去實現,也不需要被實例化的時候,可以考慮將父類寫成抽象類,將方法寫成抽象方法。比如說需要實現一些動物類和植物類,這時就可以抽象出一個父類,生命類,生命從定義上就是一個抽象的,而且也不需要實例化該類,就可以將該類定義為抽象類,生命類有一個方法————活著,至于具體怎么活,每種生物都有自己的活法,因此這里也沒辦法實現,可以將活著定義為抽象方法。
并且抽象類的實例成員可以不被子類實現
-
上面代碼會輸出:
活了0年Animal重寫的Live
接口
接口定義了所有類繼承接口時應遵循的語法合同。接口定義了語法合同 “是什么” 部分,派生類定義了語法合同 “怎么做” 部分。比如說支付寶提供了一個接口,你只要將這個接口實現,就可以調用支付寶的功能。抽象類在某種程度上與接口類似,但是,它們大多只是用在當只有少數方法由基類聲明由派生類實現時。
總結
以上是生活随笔為你收集整理的C# 学习笔记(6) 多态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 学习笔记(5) 继承
- 下一篇: C语言 匿名联合体和匿名结构体