標籤:多態 繼承 移動開發 windows 設計模式
上一次,我們瞭解了委託,委託和Lambda運算式結合是一件灰常灰常爽的事情,這也是只有.Net才有,自己偷著笑去吧。幾天這次,我要介紹一下繼承和多態,這是進行物件導向編程必須熟練掌握的技術和思想。1.1 類繼承,兒子繼承父親的遺產,這是生活中的體現,在物件導向的編程中,父親和兒子都是對象的抽象集合,也就是類。什麼是類呢?就是一些具有共同特徵的對象集合,例如:狗都有四條腿,一條尾巴,兩隻眼睛,狗都會遊泳,都愛吃骨頭,所以我們把具有以上特徵的動物抽象成狗,我們進行物件導向編程也是這樣,物件導向的程式員必須具備抽象的能力。1.1.1 欄位欄位在類中屬於封裝的部分,一般是私人成員變數或常量,如:private int _num1;private bool _dispose;_num1與 _dispose都是所屬類的欄位。1.1.2 屬性屬性是類的靜態特徵,如狗的腿有幾條,眼睛有幾隻,都是狗的屬性,在物件導向的編程中,屬性是對欄位封裝,如:private int _num1; public int Num1 { get { return _num1; } set { _num1 = value; } } private bool _dispose; public bool Dispose { get { return _dispose; } set { _dispose = value; }}Num1和Dispose都是所屬類的屬性,他們對各自的欄位進行了封裝,有的屬性是唯讀,還有的屬性只能在建構函式中進行賦值,以後不可以修改,如下: private int _dogColor; /// <summary> /// 唯讀屬性:狗的顏色 /// </summary> public int DogColor { get { return _dogColor; } } private string _pid; /// <summary> /// 只能在建構函式中賦值屬性:社會安全號碼 /// </summary> public string PID { get { return this._pid; } private set { this._pid = value; } }1.1.3 方法方法是類的行為能力,例如狗遊泳,吃骨頭,這都是狗的行為能力,在物件導向編程中,方法的結構是這樣的:/// <summary> /// 狗默默的吃方法,默默的所以是私人的 /// </summary>private void Eat() { Console.WriteLine("真好吃啊!"); }/// <summary> /// 狗遊泳,判斷狗是否遊過了river河 /// </summary> /// <param name="dogName">狗的名字</param> /// <param name="river">河的名字</param> /// <returns></returns> public bool Swim(string dogName,string river) { bool isSwim = false; if (!string.IsNullOrEmpty(river)) { Console.WriteLine(dogName + "遊過了" + river); isSwim = true; } return isSwim; }Eat和Swim都是狗類的方法,Eat方法沒有參數沒有返回值,Eat方法是私人的,只有狗類內部可以訪問Eat方法;Swim方法有兩個string型別參數,第一個參數是狗的名字,第二個參數是狗要遊過的河流,返回bool類型判斷狗是否遊過了該河流,Swim方法是公有的,所有狗對象都可以訪問Swim方法,關於private、protected、public的存取權限可以仔細閱讀微軟官方的MSDN協助文檔進行深入研究,不難理解,在這裡我就不過多介紹了,到此關於類的介紹就這些了,下面繼續介紹物件導向的核心知識之一——繼承。1.2 繼承1.2.1 繼承的原理繼承是建立在類的基礎上,具體類實現介面也可以叫做繼承,在C#中一個類只能繼承一個類,即不支援多重繼承,生活中也是這樣,一個人只能有一對親生父母;但是C#中一個類可以實現多個介面,實現介面可以理解為,我們學習了新的本領,如,我們學會了說話,我們就實現了說話的介面,我們學會了寫代碼,我們就實現了寫代碼的介面。可以看出,我們進行物件導向編程,就是類比生活製作生活,所以一個好的程式員必定是一個美好生活的締造者,廣大女同胞們要注意了,選老公一定要選程式員,選擇了程式員,你的後半生就幸福了,哈哈哈。C#中的繼承是這樣的:/// <summary> /// 產品類 /// </summary> public class Product { private string _name; public string Name { get { return _name; } set { _name = value; }} private int _age; public int Age { get { return _age; } set { _age = value; } } } /// <summary> /// 發出聲音介面 /// </summary> public interface Sound { bool MakeNoise(); } /// <summary> /// 顯示圖片介面 /// </summary> public interface ShowImage { void Show(string path); } public class NewProduct : Product, Sound, ShowImage { #region NewProduct類新成員 private string _color; public string Color { get { return _color; } set { _color = value; } } private void ChangeColor() { Console.WriteLine("顏色真的變了耶!"); } #endregion #region Sound 成員 public bool MakeNoise() { Console.WriteLine("哇塞,聲音好大啊!"); return true; } #endregion #region ShowImage 成員 public void Show(string path) { Console.WriteLine("哎呦,來自{0}圖片太漂亮了!",path); } #endregion }從上面代碼可以看出,介面沒有方法的具體實現,介面方法的具體實現代碼在繼承該介面的類中實現,但要保持簽名一致。在物件導向的編程中,子類具有父類的所有特徵,可以理解為子類是父類的擴充,父類裡的所有非私人屬性和非私人方法子類都可以訪問。1.2.1 繼承的使用實現介面也屬於繼承,那麼什麼時候繼承類,什麼時候繼承介面呢?從程式的可擴充型和複用性考慮,為了松耦合度,只有有明確的父子關係的兩個類才使用繼承類,而實現介面在程式設計模式中經常用到,易於擴充。比如,策略模式,對演算法進行封裝,經常用介面定義方法,然後具體類中具體實現,調用時由Context統一調用,在程式設計中使用適當的設計模式又是一件非常非常爽的事情,關於設計模式,我在這裡也不多介紹,如果想深入瞭解,可以觀看呂建中的官方視頻,也可以看《大話設計模式》這本書,看完之後,你會感覺更爽。1.3 多態多態按字面的意思就是“多種狀態”。在物件導向編程中,介面的多種不同的實現方式即為多態。其實多態更像是一種思想,不同實體實現同一介面是多態,重載函數方法是多態,方法重寫是多態等等,多態就是對同一功能有不同的實現方式,關於多態理解其中的思想是最為重要的,在物件導向編程中靈活運用多態那也是非常非常爽的一件事。
繼承多態總結:今天介紹的東西似乎有點多,其實不多,這些都是進行物件導向開發必須掌握的東西,如果你對上面說的內容感覺很陌生,那麼你目前是不適合做移動開發的,你最應該的馬上補充一下這是知識空白,當然物件導向的編程基礎遠不止這些,所以要想成為一流的開發人員,修鍊是必不可缺的了。好了,不在得瑟了,今天就到這裡,下次還有更爽的,敬請期待。我們下次見。