程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#之美—抽象類與接口孽緣

C#之美—抽象類與接口孽緣

編輯:C#入門知識

 

 在很久很久以前我們的祖先將我們大自然所有能動的物體都定義成“動物”。但是後來在動物的群體當中,有一類動物進化的非常快,它們的智商明顯高出其他動物,它們就是“人類”,這也許就是人類文明的起源。
所謂的“人類”開始給動物定義級別了,他們認為“人類”是最聰明的,從而將自己和普通的動物劃分界限並且人類是主導“動物”世界的頭領。[王清培版權所有,轉載請給出署名]
可是大自然總是充滿殺戮,大魚吃小魚,小魚吃蝦米。這個時候有個很聰明的“人類”動物他想統治全世界,他想來想去如何對這些動物進行管理,怎麼讓他們能服從於我。所以他進行策劃,想法設法的對這些動物進行分析,觀察他們的生活習慣,主動的去跟他們交流。他認為不管是什麼動物都將有著本質的特性,這些特性是生命的延續也是動物特征的延續。時間不知道過去了多少,他終於總結出一個讓一般動物都很難理解的“抽象”動物圖。

有了這張圖,他得意的不得了。天上飛的我讓他們專門去巡邏,陸地上跑的我讓他們全天候的伺候我,水裡的就跟好玩了,沒事出去游游泳。
顯然他沒有將人類在這張圖中體現出來,完全是高度的抽象。我們也不曉得那個人類是怎麼想的,按照我們現在的理解,這個人類應該是繼承自這個“陸地上的動物”。但是我們現在還不知道他是怎麼想的。
他覺得自己是統治者,所以他不會在圖中體現出“人類”的描述。他又進行分析了,他認為我該通過某種方式對這些動物進行管理,也就是說不同類型的動物應該有著不同的行為。比如小鳥是會飛的,我必須用籠子把它關起來。魚是會亂游,也必須有適當的魚池讓它們生成。
他又回去搗鼓管理方式的圖了。

這個“人類”看來對管理沒什麼經驗,按照這種管理方式要累死他呢。所有東西都想一手掌控,在一旁的下手可能有點管理的料,他跟頭講:“頭,你這樣管理他們可能有點不妥,你應該成立專門的管理群體,專門用來管理或者說是研究不同種類的動物”。這句話還真是給這個頭子開悟了,頭子突然發覺我似乎有跟強大的武器管理這些亂七八糟的動物了。他交代這個下屬去好好策劃策劃然後給他一個管理的組織架構圖。
每個皇帝手下都會有那麼幾個能干的將領,這個下手還真是有學問,他畫了一個他的思路圖:

這張圖再一次給領導頭子開了悟,人類既然是動物的統治者,那麼就應該對人類的管理組織架構進行抽象。所以他又交代這個下手去考慮考慮畫個圖給他看看。

領導很喜歡這個圖,很清晰的表達出了管理與被管理者之間的界限。兩個都有著自己的繼承關系,組織機構是針對管理體系的,屬於虛擬的繼承。而動物的繼承體現比較明顯點,跟我們的日常生活很像,所以容易理解。通過這個圖,思路徹底打開了,要對不同的事務進行歸納抽象,這樣才能使事務很清晰很好控制,所謂站的高看的遠。[王清培版權所有,轉載請給出署名]
 
這個領導就好像成吉思汗,喜歡打仗喜歡征服感,他要征服全世界,要不然上面的那些規劃都白費了,得有動物讓他管理才行。所有他開始策劃組織軍隊,不管是天上飛的、地上走的、河裡游的只要能打仗都可以參軍。他開始全身心的設計參軍的標准,這個時候我不管你是什麼動物,不管你長什麼樣子,只要符合參軍標准就行了。他找來那個下手,跟下手談論這宏偉的戰略目標,並且任手下為軍事參謀,輔助他的軍事設計和戰略目標規劃。經過討論他們得出一個大致的參軍標准圖:

標准一貼出去,參謀每天都要親自審核參軍者。有這個標准還真方便,基本上來的動物都符合參軍標准。軍隊逐漸成形了,頭子要求軍事參謀開始設計作戰方案。參謀覺得最重要的就是團隊配合,要將團隊的力量往一處使。所以他開始設計作戰時的手語動作。就好比特種兵在作戰時的作戰計劃,通過手語的方式表達。[王清培版權所有,轉載請給出署名]
參謀真是高人,又開始畫圖了:

有了這個作戰手語後,參謀開始想看看效果了。尋找了一個附近的島嶼開始進攻了,經過數日的作戰後,終於成功的拿下了小島,小島的所有動物都受他管理,並且人類也參與了他們的軍隊開始循環的擴大軍隊力量。[王清培版權所有,轉載請給出署名]
其實說了這麼多,目的只有一個,抽象類和接口是有著本質的區別。抽象類體現在群族、組織等一些列有著很明顯的層次結構關系的。比如:組織結構、種族、群集。
接口體現某種契約,是必須要遵守的規則,它不用來表現具有繼承關系的抽象。比如:生產標准、產品驗收標准。所以如果你將接口也視為對類型的抽象是不妥的,接口沒有任何實現目的就是為了在面向對象的領域能嚴格的區分對象和行為的區別。在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(); 
        } 
    } 

唉 貌似它體重和身高不夠啊 呵呵 不過沒關系,我們可以孕育大型的老鷹,完全是為了戰爭而生的,只需要對老鷹的基因進行培養修改。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved