我對抽象類和接口的理解
今天公司組織培訓。講解到抽象類和接口這里的時候。好像有同事不太明白。(請允許我自作多情一下!)
鑒于我自己對這部分也不是掌握的很透徹。所以發個博文上來,一是記錄一下。二是希望還不明白的朋友在閱讀完本文之后能有個了解。
新手,如有不當之處,請多多包涵!
MSDN:抽象類是從子類發現了公共的東西,泛化(也可以說把公共的東西單獨提取出來)出父類,然后子類繼承父類,而接口是根本不知道子類的存在,方法如何實現還不確定,預先定義的
有一個人,他叫王麻子,那年,他生了個兒子,起名叫 王三。這個時候用程序來描述就是他和他老婆創建了一個對象 ,代碼如下:
public class WangSan { string FirstName; string Sex; void CanDo() { Console.WriteLine("我是王三,我會畫畫"); } } |
王三有 姓、性別、和一個能力,他會畫畫。
又過了一年,王麻子和他老婆又生了個孩子,起名叫 王四,用程序來說,他們倆又創建了一個對象
public class WangSi { string FirstName; string Sex; void CanDo() { Console.WriteLine("我是王四,我會唱歌"); } } |
王四也有 姓、性別和一個能力,他會唱歌
假如一下。假如他們是印度人,對計劃生育沒什么限制,他們每隔幾年都會再生個孩子出來。這樣的話。如果要用程序來描述起來豈不是很麻煩,所以這個時候我們應該考慮對代碼進行重構,提取共同的部分,也就是姓名、性別和一個能力
如下:
public abstract class Son { protected string FirstName; protected string Sex; } |
因為他們都是王麻子的孩子,咱們假設一下,假設由于他們都是王麻子的孩子,所以他們必須 姓王、有性別,所以這個 基類 Son 就必須聲明為 abstract 的(創建就為被繼承)。就是說凡是 王麻子的孩子,都必須繼承自 Son 這個基類,因為他們都有王麻子的一些特性和自己的特性,
比如:
public class WangSan:Son { } |
我們不必在 WangSan 這個類中寫任何代碼,因為他是王麻子的孩子,所以他有 姓 和 性別。。在New WangSan 這個對象的時候。他就自動的有了 FirstName 和 Sex。這些屬性。
又假如,由于王麻子是個全能人才。所以他的孩子必須會一項技術,比如游泳或者 唱歌。這個時候 基類就可以修改一下:
public abstract class Son { protected string Name; protected string Sex; /// <summary> /// 抽象類中的抽象方法,在子類中必須自行實現 /// </summary> public abstract void CanDO(); } |
添加了 CanDo 的抽象方法。 這樣 當 王三 這個對象一被創建,他就必須繼承 Son 這個類(他必須是王麻子的兒子,莫非兩口子生的孩子是別人的??)...而又由于Son 中有個抽象的方法 CanDo. 所以。王三 他必須 得有一項技術。如果不實現 CanDo .編譯不通過(你不實現,就不能說明你是我孩子,以后我對你不好!)
public class WangSan:Son { public override void CanDO() { Console.WriteLine("我是王三,王麻子的孩子,我必須有一個擅長,那我選擇唱歌"); } } |
這樣。王三也必須會一項長處了!!
王四也是一樣。只要他是 王麻子的兒子。他就必須實現 CanDo 方法,并且有FirstName 和 Sex屬性
又假如有一天,王麻子偷師學藝,學會水上漂。但是他不知道誰愿意學,又不想強迫孩子們。所以他讓孩子們自己決定。他定義了一個接口(發布了一個規范) IShuiShangPiao。
interface IShuiShangPiao { void CanFly(); } |
誰想學。就來我這里報道。結果王武想學。所以王武來報道了(程序解釋就是王武實現這個接口)
public class WangWU : Son, IShuiShangPiao { public override void CanDO() { throw new NotImplementedException(); } /// <summary> /// 實現接口(報道),老爸就教我水上漂 /// </summary> public void CanFly() { throw new NotImplementedException(); } } |
回到我們軟件開發當中,假設以上類是我們程序中實現的一項功能,假如某一天,我們發現(或者客戶要求):凡是王麻子的孩子都必須會英語,這個時候,我們就僅僅只需要在 Son 這個類中 增加一個會說英語的方法。他的孩子們就都會說英語了。如果不采用繼承的話。假設王麻子有1萬個孩子,那就得修改一萬個類,很累。。。。
以上就是我個人針對 抽象類和 接口的理解,如有不當之處,敬請提出!
程序需要慢慢重構,這個我當時理解起來也非常不容易。多練習,多思考就會豁然開朗!
但是切記,千萬不要為了設計而設計。造成過度設計會很糟糕的。。。就好像我們設計數據庫,雖然有3大范式,但是有時候業務迫使我們不得不違背。。。。
以上!
希望對這部分不明白的朋友通過本文能對這部分知識有個進一步的了解。同時希望各位的技術一天牛比一天!!