資源描述:
《面向?qū)ο?-接口與抽象類、對(duì)象和接口(通俗講解)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、面向?qū)ο?-接口與抽象類的恩恩怨怨接口與抽象類是面向?qū)ο缶幊讨袃蓚€(gè)非常重要的角色,二者各自起著非常重要的作用。但是很多初學(xué)的朋友往往會(huì)對(duì)使用接口還是抽象類存在的很大的迷惑。就我自己的一點(diǎn)心得,發(fā)表一下拙見。面向?qū)ο蟮囊恍┗仡櫍好嫦驅(qū)ο笫澜缰杏幸粋€(gè)古老的法則:接口隔離原則,指的是不要把多個(gè)功能全部都集中在一個(gè)接口里面。接口實(shí)現(xiàn)的功能要相對(duì)單一;衍生開來(lái)可以得到另外一個(gè)結(jié)論:對(duì)一組或者稱一系列功能的實(shí)現(xiàn),盡量定義相對(duì)功能單一的小模塊來(lái)實(shí)現(xiàn)這一組功能。這其實(shí)也是解耦和的體現(xiàn)。那這跟我們的接口和抽象類有什
2、么關(guān)系呢?那又得擺出另外一個(gè)法則:依賴倒置原則,針對(duì)接口編程而不是針對(duì)實(shí)現(xiàn)編程。說(shuō)到這,又會(huì)有一個(gè)新的問題蹦出來(lái),這是自相矛盾啊,既然要針對(duì)接口編程還要抽象類干嗎使?我們經(jīng)常說(shuō)面向?qū)ο?,面向?qū)ο笫莵?lái)源于生活的。是人們要把對(duì)現(xiàn)實(shí)世界中的一系列方法論應(yīng)用到程序設(shè)計(jì)當(dāng)中來(lái)。從對(duì)象這一概念的引入我們就可以揣摩這一點(diǎn)。人類社會(huì)中有很多對(duì)象的概念,人、車、物體。不幸的是用程序來(lái)實(shí)現(xiàn)這些對(duì)象比在概念上定義對(duì)象要難很多。(如果能達(dá)成這一共識(shí),您可以繼續(xù)往下看,否則就請(qǐng)看官您移步至留言討論吧)MS給出開發(fā)者的建議是
3、,用抽象類來(lái)實(shí)現(xiàn)接口。子類再繼承基類。實(shí)例說(shuō)明:為什么要這么建議?OK,我們?cè)囍Y(jié)合實(shí)際來(lái)說(shuō)明一下這個(gè)問題吧。我們要造車。這個(gè)車有個(gè)基本的屬性就是能移動(dòng)、還必須有輪子。那我們就設(shè)計(jì)一個(gè)接口1publicinterfaceICar2{3stringWheel4{5get;6set;7}8voidMove();9}10接下來(lái)的事情,就是實(shí)現(xiàn)了。造什么車都行,繼承一下就行。隨著科技的發(fā)展,我們的車想要飛了。此時(shí)當(dāng)然不能修改這個(gè)接口,因?yàn)橐裱_閉原則。為什么要遵循?我們可以想一下,人坐上飛機(jī)能飛上天。但
4、是也沒見誰(shuí)認(rèn)為人有會(huì)飛這個(gè)特性的。那也好辦,不許修改,那我再加一個(gè)接口。1interfaceIFlyable2{3voidFly();4}5好,我們的飛行汽車最后應(yīng)該是這樣的。1classFlyCar:ICar,IAerocraft2{3privatestringwheel=string.Empty;45publicvoidFly()6{7Console.WriteLine("{0}車飛起來(lái)了",this.wheel);8}9publicstringEngine10{11get12{13retur
5、nwheel;14}15set16{17wheel=value;18}19}2021publicvoidMove()22{23Console.WriteLine("{0}輪車在走",this.wheel);24}25}26看起來(lái)很不錯(cuò),車能飛能走了。那它現(xiàn)在他的祖宗到底車還是飛行器呢?我們自己在心里辯論一下吧。估計(jì)不是很容易辯清楚。我們前面說(shuō)過,面向?qū)ο蟮乃枷雭?lái)源于現(xiàn)實(shí)生活。如果把這組例子引入到現(xiàn)實(shí)中來(lái),造會(huì)飛的汽車。肯定是要在原有的汽車上面下功夫。比如你裝上噴氣動(dòng)力裝置,或者裝上翅膀。這只屬于擴(kuò)
6、展功能,而不能說(shuō)是繼承基類。但上面的例子可以明顯的看出,我們的飛行汽車已經(jīng)成了雜交品種。分不出到底是車還是飛行器了。這里就可以知道為什么C#和JAVA都不支持多重繼承基類了。避免雜交,減少耦合。上面把車定義成接口并不完美,我們知道,一輛正常的車肯定能移動(dòng)。這是天生的本質(zhì),不需要任何實(shí)現(xiàn)。但是上面還需要子類來(lái)實(shí)現(xiàn)這個(gè)功能。從這一點(diǎn)其實(shí)可以衍生出很多問題來(lái)。我們這里不做過多討論。重新設(shè)計(jì)這個(gè)系統(tǒng)。我們可以把移動(dòng),飛行都看成是一種行為。我們的車本身?yè)碛蠱ove這個(gè)行為,是構(gòu)成車基類的基本要素。1inte
7、rfaceIMoveable2{3voidMove();4}5interfaceIFlyable6{7voidFly();8}9publicabstractclassCar:IMoveable10{11publicabstractstringWheel12{13get;14set;15}16publicvirtualvoidMove()17{18Console.WriteLine("車移動(dòng)了");19}20}21publicsealedclassFlyCar:Car,IFlyable22{23pr
8、ivatestringwheel=string.Empty;24publicoverridestringWheel25{26get27{28returnwheel;29}30set31{32wheel=value;33}34}3536publicvoidFly()37{38base.Move();39Console.WriteLine("汽車起飛成功!");40}41}42//在這里應(yīng)用任何模式都很簡(jiǎn)單了43staticvoidMain(string[]args)44{45FlyC