MSDN抽象類是從子類發現了公共的東西泛化(也可以說把公共的東西單獨提取出來)出父類然後子類繼承父類而接口是根本不知道子類的存在方法如何實現還不確定預先定義的
有一個人他叫王麻子那年他生了個兒子起名叫 王三這個時候用程序來描述就是他和他老婆創建了一個對象 代碼如下
public class WangSan { string FirstNamestring Sexvoid CanDo()
{ ConsoleWriteLine(我是王三我會畫畫)}王三有 姓性別和一個能力他會畫畫
又過了一年王麻子和他老婆又生了個孩子起名叫 王四用程序來說他們倆又創建了一個對象
public class WangSi { string FirstNamestring Sexvoid CanDo()
{ ConsoleWriteLine(我是王四我會唱歌)}王四也有 姓性別和一個能力他會唱歌
假如一下假如他們是印度人對計劃生育沒什麼限制他們每隔幾年都會再生個孩子出來這樣的話如果要用程序來描述起來豈不是很麻煩所以這個時候我們應該考慮對代碼進行重構提取共同的部分也就是姓名性別和一個能力
如下
public abstract class Son { protected string FirstNameprotected string Sex}因為他們都是王麻子的孩子咱們假設一下假設由於他們都是王麻子的孩子所以他們必須 姓王有性別所以這個 基類 Son 就必須聲明為 abstract 的(創建就為被繼承)就是說凡是 王麻子的孩子都必須繼承自 Son 這個基類因為他們都有王麻子的一些特性和自己的特性
比如
public class WangSanSon { }我們不必在 WangSan 這個類中寫任何代碼因為他是王麻子的孩子所以他有 姓 和 性別……在New WangSan 這個對象的時候他就自動的有了 FirstName 和 Sex這些屬性
又假如由於王麻子是個全能人才所以他的孩子必須會一項技術比如游泳或者 唱歌這個時候 基類就可以修改一下
public abstract class Son { protected string Nameprotected string Sex/// <summary> /// 抽象類中的抽象方法在子類中必須自行實現/// </summary> public abstract void CanDO()}添加了 CanDo 的抽象方法 這樣 當 王三 這個對象一被創建他就必須繼承 Son 這個類(他必須是王麻子的兒子莫非兩口子生的孩子是別人的??)……而又由於Son 中有個抽象的方法 CanDo 所以王三 他必須 得有一項技術如果不實現 CanDo 編譯不通過(你不實現就不能說明你是我孩子以後我對你不好!)
public class WangSanSon { public override void CanDO()
{ ConsoleWriteLine(我是王三王麻子的孩子我必須有一個擅長那我選擇唱歌)}這樣王三也必須會一項長處了!!
王四也是一樣只要他是 王麻子的兒子他就必須實現 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 這個類中 增加一個會說英語的方法他的孩子們就都會說英語了如果不采用繼承的話假設王麻子有萬個孩子那就得修改一萬個類很累……
以上就是我個人針對 抽象類和 接口的理解如有不當之處敬請提出!
程序需要慢慢重構這個我當時理解起來也非常不容易多練習多思考就會豁然開朗!
但是切記千萬不要為了設計而設計造成過度設計會很糟糕的……就好像我們設計數據庫雖然有大范式但是有時候業務迫使我們不得不違背……
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26168.html