在好久好久之前咱們的祖先將咱們大天然全部能動的物體都定義成「動物」。可是後來在動物的羣體當中,有一類動物進化的很是快,它們的智商明顯高出其餘動物,它們就是「人類」,這也許就是人類文明的起源。架構
所謂的「人類」開始給動物定義級別了,他們認爲「人類」是最聰明的,從而將本身和普通的動物劃分界限而且人類是主導「動物」世界的頭領。[王清培版權全部,轉載請給出署名]ide
但是大天然老是充滿殺戮,大魚吃小魚,小魚吃蝦米。這個時候有個很聰明的「人類」動物他想統治全世界,他想來想去如何對這些動物進行管理,怎麼讓他們能服從於我。因此他進行策劃,想法設法的對這些動物進行分析,觀察他們的生活習慣,主動的去跟他們交流。他認爲不論是什麼動物都將有着本質的特性,這些特性是生命的延續也是動物特徵的延續。時間不知道過去了多少,他終於總結出一個讓通常動物都很難理解的「抽象」動物圖。spa
有了這張圖,他得意的不得了。天上飛的我讓他們專門去巡邏,陸地上跑的我讓他們全天候的伺候我,水裏的就跟好玩了,沒事出去遊游泳。設計
顯然他沒有將人類在這張圖中體現出來,徹底是高度的抽象。咱們也不曉得那我的類是怎麼想的,按照咱們如今的理解,這我的類應該是繼承自這個「陸地上的動物」。可是咱們如今還不知道他是怎麼想的。orm
他以爲本身是統治者,因此他不會在圖中體現出「人類」的描述。他又進行分析了,他認爲我該經過某種方式對這些動物進行管理,也就是說不一樣類型的動物應該有着不一樣的行爲。好比小鳥是會飛的,我必須用籠子把它關起來。魚是會亂遊,也必須有適當的魚池讓它們生成。對象
他又回去搗鼓管理方式的圖了。blog
這個「人類」看來對管理沒什麼經驗,按照這種管理方式要累死他呢。全部東西都想一手掌控,在一旁的下手可能有點管理的料,他跟頭講:「頭,你這樣管理他們可能有點不妥,你應該成立專門的管理羣體,專門用來管理或者說是研究不一樣種類的動物」。這句話還真是給這個頭子開悟了,頭子忽然發覺我彷佛有跟強大的武器管理這些亂七八糟的動物了。他交代這個下屬去好好策劃策劃而後給他一個管理的組織架構圖。繼承
每一個皇帝手下都會有那麼幾個能幹的將領,這個下手還真是有學問,他畫了一個他的思路圖:接口
這張圖再一次給領導頭子開了悟,人類既然是動物的統治者,那麼就應該對人類的管理組織架構進行抽象。因此他又交代這個下手去考慮考慮畫個圖給他看看。事務
領導很喜歡這個圖,很清晰的表達出了管理與被管理者之間的界限。兩個都有着本身的繼承關係,組織機構是針對管理體系的,屬於虛擬的繼承。而動物的繼承體現比較明顯點,跟咱們的平常生活很像,因此容易理解。經過這個圖,思路完全打開了,要對不一樣的事務進行概括抽象,這樣才能使事務很清晰很好控制,所謂站的高看的遠。[王清培版權全部,轉載請給出署名]
這個領導就好像成吉思汗,喜歡打仗喜歡征服感,他要征服全世界,要否則上面的那些規劃都白費了,得有動物讓他管理才行。全部他開始策劃組織軍隊,不論是天上飛的、地上走的、河裏遊的只要能打仗均可以參軍。他開始全身心的設計參軍的標準,這個時候我無論你是什麼動物,無論你長什麼樣子,只要符合參軍標準就好了。他找來那個下手,跟下手談論這宏偉的戰略目標,而且任手下爲軍事參謀,輔助他的軍事設計和戰略目標規劃。通過討論他們得出一個大體的參軍標準圖:
標準一貼出去,參謀天天都要親自審覈參軍者。有這個標準還真方便,基本上來的動物都符合參軍標準。軍隊逐漸成形了,頭子要求軍事參謀開始設計做戰方案。參謀以爲最重要的就是團隊配合,要將團隊的力量往一處使。因此他開始設計做戰時的手語動做。就比如特種兵在做戰時的做戰計劃,經過手語的方式表達。[王清培版權全部,轉載請給出署名]
參謀真是高人,又開始畫圖了:
有了這個做戰手語後,參謀開始想看看效果了。尋找了一個附近的島嶼開始進攻了,通過很多天的做戰後,終於成功的拿下了小島,小島的全部動物都受他管理,而且人類也參與了他們的軍隊開始循環的擴大軍隊力量。[王清培版權全部,轉載請給出署名]
其實說了這麼多,目的只有一個,抽象類和接口是有着本質的區別。抽象類體如今羣族、組織等一些列有着很明顯的層次結構關係的。好比:組織結構、種族、羣集。
接口體現某種契約,是必需要遵照的規則,它不用來表現具備繼承關係的抽象。好比:生產標準、產品驗收標準。因此若是你將接口也視爲對類型的抽象是不妥的,接口沒有任何實現目的就是爲了在面向對象的領域能嚴格的區分對象和行爲的區別。在IL層面上,接口也是抽象的類行爲也是虛方法。目的是讓咱們站在面向對象的角度使用語言,而語言的特性是爲了面向對象的概念作支撐。
下面咱們來用代碼模擬上述的模型,首先是對動物世界的高度抽象,因此咱們固然是須要一個抽象類,表示全部動物的基類。
/** * author:深度訓練 * blog:http://wangqingpei557.blog.51cto.com/ **/ using System; using System.Collections.Generic; using System.Text; using System.Drawing; namespace ConsoleApplication1 { /// <summary> /// 動物的頂層抽象 /// </summary> public abstract class AnimalBase { /// <summary> /// 動物的膚色 /// </summary> public abstract Color Complexion { get; set; } /// <summary> /// 動物的身高 /// </summary> public abstract int Stature { get; set; } /// <summary> /// 動物的體重 /// </summary> public abstract int Avoirdupois { get; set; } /// <summary> /// 吃飯的動做 /// </summary> /// <param name="food">食物對象</param> public abstract void Dining(object food); } }
我定義了兩個基本的屬性,Complexion膚色、Stature身高,還有一個動做Dining就是吃飯。爲何都是抽象的呢?由於咱們的抽象層次很高,不一樣的動物有着不一樣的身高、不一樣的膚色、不一樣的吃飯習慣。因此都是抽象的,表示後面的派生對象能對基類的成員進行具體化。[王清培版權全部,轉載請給出署名]
咱們派生一個會飛的動物類:
/** * author:深度訓練 * blog:http://wangqingpei557.blog.51cto.com/ **/ using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { /// <summary> /// 會飛的動物基類,可是它的祖先是動物類:AnimalBase /// </summary> public abstract class FlyAnimal : AnimalBase { /// <summary> /// 飛行高度 /// </summary> public abstract int FlyHeight { get; set; } /// <summary> /// 飛行速度(KM/h) /// </summary> public abstract float FlySpeed { get; set; } /// <summary> /// 飛行的行爲 /// </summary> public void FlyFun() { Console.WriteLine("起飛吧......."); } } }
在繼承了AnimalBase以後,FlyAnimal也就是動物了,可是它增添了不少其餘的動物色彩,它是一個會飛動物的基類,只要誰繼承它了就會飛了,由於它已經具有飛的能力,至於能飛多高要看孕育的怎麼樣了呵呵,老鷹必定比麻雀飛的高。[王清培版權全部,轉載請給出署名]
咱們孕育一隻老鷹吧,但願咱們都飛的更高:
/** * author:深度訓練 * blog:http://wangqingpei557.blog.51cto.com/ **/ using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { /// <summary> /// 老鷹,會飛的。 /// </summary> public class GledeAnimal : FlyAnimal, JoinArmycorps { private int _flyheight = 1000; /// <summary> /// 飛的高度,最高爲1000米 /// </summary> public override int FlyHeight { get { return _flyheight;//能飛1000米高 } set { _flyheight = value; //徹底能夠控制它飛多高的,要否則後面的仗怎麼打啊; } } private float _flyspeed = 100; /// <summary> /// 飛行速度,最快爲100KM/h /// </summary> public override float FlySpeed { get { return _flyspeed; } set { _flyspeed = value; //固然也是能夠控制的 } } /// <summary> /// 膚色,咱們定義爲羽毛顏色 /// </summary> public override System.Drawing.Color Complexion { get { return System.Drawing.Color.Black; } set { //顏色哪能換啊 } } /// <summary> /// 身高,估計也就50CM差很少了 /// </summary> public override int Stature { get { return 50; } set { //身高彷佛能夠設置,這裏就不支持了。 } } /// <summary> /// 體重,估計也就50斤左右吧。 /// </summary> public override int Avoirdupois { get { return 50; } set { //不會是100斤的。 } } public override void Dining(object food) { Console.WriteLine("比較喜歡吃:" + food.ToString()); } public bool Take300KgPoleaxe() { return true; } public bool Run60MinuteStanding() { return true; } } }
老鷹做爲具體的動物,須要實現全部繼承下來的抽象成員,惟獨一個會飛的行爲不須要實現。
繼承真是偉大,一輩子下來就具有了飛行的能力,可是也得多加練習才行。
老鷹據說如今能夠參軍了,它以爲本身不去參軍簡直是浪費,老鷹去看看參軍要求,以爲能夠實現。
軍事參謀的參軍要求:
/** * author:深度訓練 * blog:http://wangqingpei557.blog.51cto.com/ **/ using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { /// <summary> /// 軍事參謀貼出來的參軍要求 /// </summary> public interface JoinArmycorps { /// <summary> /// 身高CM /// </summary> int Stature { get; set; } /// <summary> /// 體重KM /// </summary> int Avoirdupois { get; set; } /// <summary> /// 是否能拿起300KG中的戰斧 /// </summary> /// <returns>true:能拿起,false拿不起來</returns> bool Take300KgPoleaxe(); /// <summary> /// 快速奔跑持續一小時 /// </summary> /// <returns>true:沒問題,false歇菜了</returns> bool Run60MinuteStanding(); } }
老鷹應該沒問題的,它那麼厲害;去參謀那裏審覈了:
using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //構造老鷹 FlyAnimal flyanimal = new GledeAnimal(); flyanimal.FlyFun(); flyanimal.Dining("兔子肉");//給點兔子肉給你吃 JoinArmycorps joinarmycorps = flyanimal as JoinArmycorps; //軍事參謀準備採用參軍標準進行審覈 if (joinarmycorps.Run60MinuteStanding()) { if (joinarmycorps.Take300KgPoleaxe()) { if (joinarmycorps.Stature > 170) { if (joinarmycorps.Avoirdupois > 80) { Console.WriteLine("合格的軍人!"); } else { Console.WriteLine("體重不過關!"); } } else { Console.WriteLine("身高不過關!"); } } } Console.ReadLine(); } } }
唉 貌似它體重和身高不夠啊 呵呵 不過不要緊,咱們能夠孕育大型的老鷹,徹底是爲了戰爭而生的,只須要對老鷹的基因進行培養修改。
總結:其實文章要說明的東西基本上也很清楚了,雖然接口也具有屬性和行爲,可是它和抽象類是有區別的,這裏的參軍接口就是一種約定一種規範,老鷹必須必須具有這些因素才行。[王清培版權全部,轉載請給出署名]
本文出自 「pattern driven the world」 博客,請務必保留此出處http://wangqingpei557.blog.51cto.com/1009349/961136