小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

面向?qū)ο?-接口與抽象類的恩恩怨怨 -UML軟件工程組織-火龍果軟件

 miky 2008-10-12
面向?qū)ο?-接口與抽象類的恩恩怨怨
 
作者:hunanboy 來自:cnblogs 天道酬勤博客
 

接口與抽象類是面向?qū)ο缶幊讨袃蓚€非常重要的角色,二者各自起著非常重要的作用。但是很多初學(xué)的朋友往往會對使用接口還是抽象類存在的很大的迷惑。就我自己的一點心得,發(fā)表一下拙見。

面向?qū)ο蟮囊恍┗仡櫍?/strong>

面向?qū)ο笫澜缰杏幸粋€古老的法則:接口隔離原則,指的是不要把多個功能全部都集中在一個接口里面。接口實現(xiàn)的功能要相對單一;衍生開來可以得到另外一個結(jié)論:對一組或者稱一系列功能的實現(xiàn),盡量定義相對功能單一的小模塊來實現(xiàn)這一組功能。這其實也是解耦和的體現(xiàn)。

那這跟我們的接口和抽象類有什么關(guān)系呢?那又得擺出另外一個法則:依賴倒置原則,針對接口編程而不是針對實現(xiàn)編程。

說到這,又會有一個新的問題蹦出來,這是自相矛盾啊,既然要針對接口編程還要抽象類干嗎使?我們經(jīng)常說面向?qū)ο?,面向?qū)ο笫莵碓从谏畹摹J侨藗円褜ΜF(xiàn)實世界中的一系列方法論應(yīng)用到程序設(shè)計當(dāng)中來。 從對象這一概念的引入我們就可以揣摩這一點。人類社會中有很多對象的概念,人、車、物體。不幸的是用程序來實現(xiàn)這些對象比在概念上定義對象要難很多。
(如果能達成這一共識,您可以繼續(xù)往下看,否則就請看官您移步至留言討論吧)

MS給出開發(fā)者的建議是,用抽象類來實現(xiàn)接口。子類再繼承基類。

實例說明:

為什么要這么建議?OK,我們試著結(jié)合實際來說明一下這個問題吧。我們要造車。這個車有個基本的屬性就是能移動、還必須有輪子。那我們就設(shè)計一個接口


 1public interface ICar
 2    {
 3        string Wheel
 4        {
 5            get;
 6            set;
 7        }

 8        void Move();
 9    }

10

接下來的事情,就是實現(xiàn)了。造什么車都行,繼承一下就行。隨著科技的發(fā)展,我們的車想要飛了。此時當(dāng)然不能修改這個接口,因為要遵循開閉原則。為什么要遵循?我們可以想一下,人坐上飛機能飛上天。但是也沒見誰認為人有會飛這個特性的。那也好辦,不許修改,那我再加一個接口。


1interface IFlyable
2    {
3        void Fly();
4    }

5

好,我們的飛行汽車最后應(yīng)該是這樣的。


 1class FlyCar : ICar,IAerocraft
 2    {
 3        private string wheel = string.Empty;
 4
 5        public void Fly()
 6        {
 7            Console.WriteLine("{0}車飛起來了",this.wheel);
 8        }

 9        public string Engine
10        {
11            get
12            {
13                return wheel;
14            }

15            set
16            {
17                wheel = value;
18            }

19        }

20
21        public void Move()
22        {
23            Console.WriteLine("{0}輪車在走",this.wheel);
24        }

25    }

26

看起來很不錯,車能飛能走了。那它現(xiàn)在他的祖宗到底車還是飛行器呢?我們自己在心里辯論一下吧。估計不是很容易辯清楚。

我們前面說過,面向?qū)ο蟮乃枷雭碓从诂F(xiàn)實生活。如果把這組例子引入到現(xiàn)實中來,造會飛的汽車??隙ㄊ且谠械钠嚿厦嫦鹿Ψ?。比如你裝上噴氣動力裝置,或者裝上翅膀。這只屬于擴展功能,而不能說是繼承基類。但上面的例子可以明顯的看出,我們的飛行汽車已經(jīng)成了雜交品種。分不出到底是車還是飛行器了。這里就可以知道為什么C#和JAVA都不支持多重繼承基類了。避免雜交,減少耦合。

上面把車定義成接口并不完美,我們知道,一輛正常的車肯定能移動。這是天生的本質(zhì),不需要任何實現(xiàn)。但是上面還需要子類來實現(xiàn)這個功能。從這一點其實可以衍生出很多問題來。我們這里不做過多討論。

重新設(shè)計這個系統(tǒng)。我們可以把移動,飛行都看成是一種行為。我們的車本身擁有Move這個行為,是構(gòu)成車基類的基本要素。


 1interface IMoveable
 2    {
 3        void Move();
 4    }

 5    interface IFlyable
 6    {
 7        void Fly();
 8    }

 9public abstract class Car : IMoveable
10    {
11        public abstract string Wheel
12        {
13            get;
14            set;
15        }

16        public virtual void Move()
17        {
18            Console.WriteLine("車移動了");
19        }

20    }

21    public sealed class FlyCar : Car,IFlyable
22    {
23        private string wheel = string.Empty;
24        public override string Wheel
25        {
26            get
27            {
28                return wheel;
29            }

30            set
31            {
32                wheel = value;
33            }

34        }
        
35
36        public void Fly()
37        {
38            base.Move();
39            Console.WriteLine("汽車起飛成功!");
40        }

41    }

42    //在這里應(yīng)用任何模式都很簡單了
43    static void Main(string[] args)
44    {       
45            FlyCar c = new FlyCar();
46            ((IFlyable)c).Fly();
47            ((Car)c).Move();
48    }

49

總結(jié)歸納: 其實類似的例子在我們的.NET Library里隨處可見,例如Control類是繼承于Component和其他大量的接口的,而他們的基類卻是MarshalByRefObject。因為他們歸功到底又屬于引用對象。

從上面的描述中,我們可以得出結(jié)論:

接口:是某類行為或功能的抽象。是一種開關(guān)或者是契約。所以從字面上來理解就非常清楚了,西方神話中有很多和魔鬼定下契約來使自己的力量得到提升的故事。你必須定下這個契約才能得到你想要的力量。

抽象類:對具體對象的最高抽象,這個對象擁有自己的最基本特征。

所以,從整體上來講,抽象類和接口本質(zhì)上都是是系統(tǒng)的最高抽象。從實際上來講,二者抽象的對象不一樣,就這一點導(dǎo)致了他們二者的應(yīng)用的截然不同。

技術(shù)原創(chuàng)作品,請尊重他人勞動成果,轉(zhuǎn)載請注明出處;不得用于任何商業(yè)形式活動,否則將追究法律責(zé)任

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多