




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、談抽象類與接口的區(qū)別之一-X抽象類:抽線類是特殊的類.只是不能被實例化:除此以外.具有類的其他特性:垂要的是抽象類可以包括抽線方法這是普通類所不能的。抽象方法只能聲明于抽象類中.且不包含任何實現(xiàn).派生類必須覆蓋它們。另外.抽線類可以派生自一個抽線類.町以覆蓋基類的抽線方法也町以不覆蓋.如果不覆蓋.則其派生類必須覆蓋它們。二接口:接口是引用類型的.類似于類,和抽象類的相似之處有三點:不能實例化:包含未實現(xiàn)的方法聲明:派生類必須實現(xiàn)耒實現(xiàn)的方法,抽彖類是抽象方法.接口則是所有成員(不儀是方法包扌舌其他成員):另外.接口有如下特性:接口除了町以包含方法之外還町以包含屬性.索引器.爭件.而且這些成員都
2、被定義為公有的。除此之外,不能包含任何其他的成員,例如:當1S、域、構造函數(shù)、析構函數(shù).靜態(tài)成員。一個類町以直接繼承多個接口,但只能直接繼承一個類(包括抽線類)。三、抽象類和接口的區(qū)別,1類是對劉彖的抽象可以把抽彖類理解為把類半作對務抽象成的類叫做抽線類而接口只是一個行為的規(guī)范或規(guī)定,微軟的H定義接口總是后wable字段證明其是表述類類“我能做。抽彖類更多的是定義在一系列緊密相關的類間.而接口大多數(shù)是關系疏松但都實現(xiàn)某一功能的類中.接口基木上不具備繼承的任何具體特點,它僅儀承諾了能夠調(diào)用的方法;個類一次町以實現(xiàn)若干個接口,但是只能擴展一個父類接口可以用于支持回調(diào),而繼承并不具備這個特點.抽象類
3、不能被密封。6抽線類實現(xiàn)的具體方法默認為虛的但實現(xiàn)接口的類中的接口方法卻默認為非虛的.然您也町以聲明為虛的.7.(接口)與非抽線類類似.抽線類也必須為在該類的基類列衷中列出的接口的所有成員提供它fl己的實現(xiàn)。但是.允許抽象類將接口方法映射到抽象方法上。&抽線類實現(xiàn)了oop中的一個原則,把可變的與不可變的分離。抽線類和接口就是定義為不町變的.而把可變的座位子類去實現(xiàn)。9好的接口定義應該是具有專一功能性的而不是多功能的,否則造成接口污染。如果一個類只是實現(xiàn)了這個接口的中一個功能.而不得不去實現(xiàn)接口中的其他方法,就叫接口污染。10盡昴避免使用繼承來實現(xiàn)紐建功能,而是使川黑箱復用.即對象紐合。丙為繼承
4、的層次增多.造成城直接的后果就是當你調(diào)用這個類群中某一類.就必須把他們?nèi)考游业綏V校『蠊攵?(結合堆棧原理理解。同時,有心的朋友可以留色到微軟在構建一個類時很多時候川到了對彖組合的方法。比如中.Page類有ServerRequest等屬性,但其實他們都是某個類的對線。使丿IJPage類的這個對象來調(diào)用另外的類的方法和屬性,這個是非常基木的個設計原則。11如果抽線類實現(xiàn)接口,則可以把接口中方法映射到抽彖類中作為抽線方法而不必實現(xiàn).而在抽彖類的子類中實現(xiàn)接口中方法.四、抽象類和接口的使用:1如果預計要創(chuàng)建組件的多個版木則創(chuàng)建抽線類。抽線類提供簡單的方法來控制組件版木。2如果創(chuàng)建的功能將在大
5、范用的全界對線間使用.則使用接口。如果要設計小而簡練的功能塊.則使川接口。3如果要設計大的功能單元.則使用抽象類如果要在組件的所有實現(xiàn)間提供通用的C實現(xiàn)功能則使用抽線類。4抽線類主要用于關系矗切的劉彖:而接口適合為不相關的類提供通用功能。以下是我在網(wǎng)上看到的幾個形象比喻,玫的非常不錯,呵呵:仁飛機會飛.鳥會飛.他們都繼承了同一個接口“飛J但是F22朋于飛機抽象類,鴿子局于鳥抽象類。2.就像鐵門木門都是門(抽象類),你想要個門我給不了(不能實例化),但我可以給你個具體的鐵門或木門(多態(tài)八而且只能是門,你不能說它是窗(單繼承:一個門町以有鎖(接口)也可以有門鈴(多實現(xiàn))Ofj(抽線類定義了你是什么
6、.接口(鎖)規(guī)定了你能做什么(一個接口報好只能做一件你不能要求鎖也能發(fā)出聲音吧(接口污染)staticfinalpublicprivatestaticpublicprivate談抽象類與接口的區(qū)別之二abstractclass和interface是Java語言中對于抽線類能義進行支持的兩種機制.iE是由于這兩種機制的存才賦予了Java強大的面向對象能力。abstractclass和interface之間在對于抽線類定義的支持方ifOl有很大的相似性.甚至可以郴”替換.因此很多開發(fā)者在進行抽線類定義時對于abstractclass和interface的選擇顯得比較隨總。其實.兩者之.間還是有很大
7、的區(qū)別的.對于它們的選擇甚至反映出對于問題領域木質(zhì)的理解、對于設計意圖的理解是否正確、合理。木文將對它們之間的區(qū)別進行一帑剖析試圖給開發(fā)者提供一個在二者之間進行選擇的依據(jù)。-X理解抽象類abstractclass和interface/f:Java語認中都是用來進行抽象類(本文中的抽象類并非從abstractclass翻譯而來.它表示的是一個抽線體.而abstractclass為Java語言中用于定義抽線類的-種方法.諸讀者注憊區(qū)分)定義的.那么什么是抽象類,使用抽象類能為我們帶來什么好處呢?在面向對象的概念中我們知道所有的對象都是通過類來描繪的但是反過來卻不是這樣。并不是所有的類都是用來描繪對
8、線的.如果一個類中沒有包含足夠的信息來描繪一個具體的對線.這樣的類就是抽象類。抽線類往往用來農(nóng)征我們在對何題領域進行分析、設計中得出的抽彖概念.是對一系列看上去不同,但是木質(zhì)上相同的具體概念的抽線。比如:如果我們進行一個圖形編輯軟件的開發(fā)就會發(fā)現(xiàn)問題領域存在著換I、三角形這樣一些具體概念.它們是不同的.但是它們又都風于形狀這樣一個概念.形狀這個概念在何題領域是不存在的.它就是一個抽線概念。正是丙為抽線的概念在問題領域沒有劉應的具體概念所以用以農(nóng)征抽線概念的抽線類是不能夠實例化的。在而向對象領域.抽象類主要川來進行類型隱藏。我們可以構造出一個固定的一紐行為的抽線描述.但是這組行為卻能夠有任意個町
9、能的具體實現(xiàn)方式。這個抽線描述就是抽線類.而這-組任盤個對能的具體實現(xiàn)則農(nóng)現(xiàn)為所有町能的派生類。棋塊可以操作一個抽線體。由于模塊依賴F個固定的抽象體.因此它可以是不允許修改的:同時.通過從這個抽線體派生,也町擴展此棋塊的行為功能。熟悉OCP的讀者一定知道.為了能夠實現(xiàn)而向對線設計的一個放核心的原則OCP(Open-ClosedPrinciple).抽象類是其中的關鍵所在。二、從語法定義層面看abstractclass和interface在語法層面,Java語言對于abstractclass和interface給出了不同的定義方式,下面以定義一個名為Demo的抽象類為例來說明這種不同。使用abs
10、tractclass的方式定義Demo抽線類的方式如下abstractclassDemoabstractvoidmethodi();abstractvoidmethod2();使JIJinterface的方式定義Demo抽線類的方式如下:interfaceDemovoidmethod!();voidmethod2();)abstractclass方式中.Demo可以有自己的數(shù)據(jù)成員,也可以有l(wèi)habstarct的成員方法,而Ainterface方式的實現(xiàn)中,Demo只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是staticfinal的.不過在interface中一般不定義數(shù)據(jù)成員),所有的成
11、員方法都是abstract的。從某種意義上說,Interface是一種特殊形式的abstractclass從編程的角度來看,abstractclass和interface都町以用來實現(xiàn)designbycontract的思想。但是在具體的使用上面還是有一些區(qū)別的。斤先.abstractClassiJava語言中農(nóng)示的是種繼承關系.個類只能使川一次繼承關系。但是,個類卻町以實現(xiàn)多個interface。也許.這是Java語言的設計者在考慮Java對于多重繼承的支持方而的一種折中考慮吧。其次,abstractclass的定義中.我們可以賦予方法的默認行為。但是在Interface的定義中.方法卻不能擁
12、有默認行為.為了繞過這個限制,必須使用委托但是這會増加一些復朵性,有時會造成很大的麻煩。在抽象類中不能定義默認行為還存在另一個比較嚴垂的何題,那就是可能會造成維護上的麻煩。因為如果后來想修改類的界面(-般通過abstractclass或者interface來表示)以適應新的怙況(比如添加新的方法或者給C用的方法中添加新的參數(shù)H1.就會非常的麻煩可能要花費很多的時間(對于派生類很多的借況,尤為如此)。但是如果界面是通過abstractclass來實現(xiàn)的,那么可能就只需要修改定義在abstractclass中的默認行為就可以了。abstractclassis-ainterfaceHlike-aH同
13、樣.如果不能在抽線類中定義默認行為.就會導致同樣的方法實現(xiàn)出現(xiàn)在該抽象類的毎一個派生類中.違反了Pnerule,oneplace原則.適成代碼車:復.同樣不利于以后的維護。因此(:.abstractclass和interface間進行選擇時要非常的小心。三.從設計理念層面看abstractclass和interface上面主要從語法迅義和編程的角度論述了abstractclass和interface的區(qū)別.這些層而的區(qū)別是比較低層次的.II沐質(zhì)的。本文將從另一個層面:abstractclass和interface所反映出的設計理念,來分析一下二者的區(qū)別。作者認為,從這個層而進行分析才能理解二者
14、概念的木質(zhì)所在。前面已經(jīng)提到過,abstarctclass在Java語言中體現(xiàn)了-種繼承關系,要想使得繼承關系介理,父類和派生類之間必須存忙isa”關系.即父類和派生類在概念木質(zhì)上應該是相同的。對于interface來說則不然.并不要求interface的實現(xiàn)者和interface定義在概念木質(zhì)上是一致的僅僅是實現(xiàn)了interface定義的契約而已。為了使論述便于理解下面將通過一個簡單的實例進行說明。考慮這樣一個例子假設心我們的問題領域中有一個關于Door的抽線概念該Door具有執(zhí)行兩個動作open和close.此時我們町以通過abstractclass或interface來定義一個表示該抽象
15、概念的類型,定義方式分別如下所示:使用abstractclass方式定義Door:abstractclassDoorabstractvoidopen();abstractvoidclose():使用interface方式定義Door:interfaceDoorvoidopen();voidclose();其他具體的Door類型可以extends使用abstractclass方式定義的Door或implements使用interface方式定義的Door。看起來好像便用abstractclass和interface沒有大的區(qū)別。如杲現(xiàn)在要求Door還要具有報警的功能。我們該如何設計針劉該例子的類
16、結構呢(在木例中主要是為了展示abstractclass和interface反映在設計理念上的區(qū)別其他方而無關的何題都做了簡化或者忽略)下面將羅列出可能的解決方案,并從設計理念層面對這些不同的方案進行分析。解決方案一:簡單的在Door的定義中増加一個alarm方法,如下:abstractclassDoorabstractvoidopen();abstractvoidclose():abstractvoidalarm();或者interfaceDoorvoidopen();voidclose();voidalarm();那么具有報警功能的AlarmDoor的定義方式如下:classAlarmDo
17、orextendsDoorvoidopen()voidclose().voidalarm().或者classAlarmDoorimplementsDoorvoidopen()voidclose()voidalarm()這種方法違反了而向對線設計中的一個核心原則ISP(InterfaceSegregationPriciple)在Door的遠義中把Door概念木身固有的行為方法和另外一個概念報警器-的行為方法混在了一起。這樣引起的一個問題是那些僅僅依賴于Door這個概念的模塊會悶為”報警器這個概念的改變(比如:修改alarm方法的參數(shù))而改變.反之依然。解決方案二:既然open、close和ala
18、rm屈于兩個不同的概念很據(jù)ISP原則應該把它們分別定義代農(nóng)這兩個概念的抽彖類中。定義方式有這兩個概念都使川abstractclass方式定義:兩個概念都使用interface方式定義:一個概念使用abstractclass方式定義,另一個概念使用interface方式定義。顯然.由于Java語言不支持多垂繼承.所以兩個概念都使JIJabstractclass方式定義是不對行的。后而兩種方式都是對行的,但是對于它們的選擇卻反映出對于問趣領域中的概念木質(zhì)的理解.對于設計意圖的反映是否正確.合理。我們來分析.說明。如果兩個概念都使用interface方式來定義.那么就反映出兩個問題:1、我們對能沒有理解清楚問題領域.AlarmDoor概念木質(zhì)上到底是Door還是報警器?如果我們對于問題領域的理解沒有問題比如:我們通過對于問題領域的分析發(fā)現(xiàn)AlarmDoor在概念木質(zhì)上和Door是一致的.那么我們在實現(xiàn)時就沒有能夠止確的揭示我們的設計總圖.因為在這兩個概念的定義上(均使用interface方式定義)反映不出上述含義。如果我們對干問題領域的理解是:AlarmDoor在概念木質(zhì)上是Door.同時它有具有報警的功能。我們該如何來設計.實現(xiàn)來明確的反映出我們的意思呢?前面已經(jīng)說過.abstractc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學校校服廠管理制度
- 學校配電間管理制度
- 學生對班級管理制度
- 學院各科室管理制度
- 安全品牌部管理制度
- 安息堂人員管理制度
- 安裝充電樁管理制度
- 完善總資產(chǎn)管理制度
- 實驗室收費管理制度
- 客戶更衣區(qū)管理制度
- 電力電子技術在電力系統(tǒng)中的應用
- 地鐵站保潔方案
- 《律師執(zhí)業(yè)紀律與職業(yè)道德》考試復習題庫(含答案)
- 飛機結構設計課件
- 數(shù)學思想與方法-國家開放大學電大機考網(wǎng)考題目答案
- 病媒生物防制投標方案(技術標)
- 赤峰高新技術產(chǎn)業(yè)開發(fā)區(qū)元寶山產(chǎn)業(yè)園(原元寶山綜合產(chǎn)業(yè)園區(qū)區(qū)塊)地質(zhì)災害危險性評估報告
- 浙江省溫州市2022-2023學年八年級下學期期末科學試卷
- 充電樁工程施工方案解決方案
- 建筑固定消防設施課件
- 北師大版二年級數(shù)學下冊《最喜歡的水果》教案及教學反思
評論
0/150
提交評論