面向?qū)ο?-接口與抽象類、對(duì)象和接口(通俗講解)

面向?qū)ο?-接口與抽象類、對(duì)象和接口(通俗講解)

ID:6714184

大小:33.00 KB

頁(yè)數(shù):5頁(yè)

時(shí)間:2018-01-23

面向?qū)ο?-接口與抽象類、對(duì)象和接口(通俗講解)_第1頁(yè)
面向?qū)ο?-接口與抽象類、對(duì)象和接口(通俗講解)_第2頁(yè)
面向?qū)ο?-接口與抽象類、對(duì)象和接口(通俗講解)_第3頁(yè)
面向?qū)ο?-接口與抽象類、對(duì)象和接口(通俗講解)_第4頁(yè)
面向?qū)ο?-接口與抽象類、對(duì)象和接口(通俗講解)_第5頁(yè)
資源描述:

《面向?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

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。