第六章面向接口而非實(shí)現(xiàn)進(jìn)行編程_第1頁
第六章面向接口而非實(shí)現(xiàn)進(jìn)行編程_第2頁
第六章面向接口而非實(shí)現(xiàn)進(jìn)行編程_第3頁
第六章面向接口而非實(shí)現(xiàn)進(jìn)行編程_第4頁
第六章面向接口而非實(shí)現(xiàn)進(jìn)行編程_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、在第6章中,編程是面向接口的,而不是實(shí)現(xiàn)的。在第6章中,應(yīng)用編程接口是文檔描述和接口描述的通稱。通常,一個(gè)類由兩部分組成:開放成員和非開放成員。如前一章所述,應(yīng)用編程接口披露的越少越好。代碼分為兩部分:接口和實(shí)現(xiàn)。在編寫代碼時(shí),我們的習(xí)慣是讓系統(tǒng)的其他部分只依賴于接口。接口只是用來向用戶揭示解釋部分,而實(shí)現(xiàn)是類內(nèi)的具體實(shí)現(xiàn)過程。添加方法容易,刪除方法難。設(shè)計(jì)師帶來的問題往往比他們解決的問題多。向應(yīng)用編程接口添加一個(gè)新方法很容易,但相反,從應(yīng)用編程接口中移除一個(gè)方法非常困難。應(yīng)用編程接口提供的功能越多,維護(hù)向后兼容性的工作就越多。提供的功能越多,留給具體實(shí)現(xiàn)的空間就越少。如果應(yīng)用編程接口暴露了更

2、多不必要的內(nèi)容,那么改進(jìn)的空間就更小了。方法添加和移除,1代碼不是API:它需要抽象描述為API,不需要重構(gòu),那么暴露的可能不是API,而是內(nèi)部的具體實(shí)現(xiàn)。不要把代碼當(dāng)作一個(gè)應(yīng)用編程接口,還要努力把它整理好。發(fā)布的是接口不是一個(gè)實(shí)現(xiàn):它是調(diào)用方的接口應(yīng)用程序,而不是發(fā)布的類的特定實(shí)現(xiàn)描述。3邏輯分離和物理分離:只有類描述和類實(shí)現(xiàn)是分離的,但是文件仍然是過去的。4物理分離:接口描述和實(shí)現(xiàn)描述在兩個(gè)不同的文件中,實(shí)現(xiàn)物理分離。已經(jīng)宣布接口不是實(shí)現(xiàn),編程應(yīng)該面向接口而不是現(xiàn)實(shí):使用應(yīng)用編程接口時(shí)應(yīng)該遵守正確的原則。不要依賴未指定的屬性和文件資源:不要依賴文檔中沒有提到的屬性和文件資源。提出適當(dāng)?shù)膽?yīng)用

3、編程接口要求:正確的做法是要求設(shè)計(jì)者提供適當(dāng)?shù)膽?yīng)用編程接口。使用公開來完成某個(gè)功能是非常脆弱的,并且由于不同的版本和環(huán)境,它將不能正常工作。編程應(yīng)該面向接口,而不是現(xiàn)實(shí)。為了正確理解面向接口編程的概念,Iterface只是一個(gè)接口描述:可以清楚地理解,面向接口編程并不對應(yīng)于Java中的Iterface。這種編程方法僅將其抽象定義與實(shí)際實(shí)現(xiàn)分開。類的使用特點(diǎn):何時(shí)使用類接口使用特點(diǎn):何時(shí)使用接口、6.1刪除方法或字段,不要隨意刪除方法和屬性: (1)設(shè)計(jì)方法或?qū)傩哉谑褂茫?2)類將設(shè)置對相關(guān)方法和屬性的訪問權(quán)限。(3)類的成員是繼承的:設(shè)計(jì)方法或?qū)傩哉谑褂弥?,從公開的類或接口中移除方法或字段

4、是錯(cuò)誤的。系統(tǒng)是開放的,這可能表明該方法或?qū)傩跃哂幸欢ǖ拇硇裕虼似渌蓡T正在使用它。如果一個(gè)方法或字段被定義為私有的或默認(rèn)的包訪問級別,它對外部代碼是不可見的,并且不能被訪問。在這種情況下,從類中移除內(nèi)容不會(huì)導(dǎo)致任何問題,但是這是沒有意義的。類設(shè)置相關(guān)方法和屬性的訪問權(quán)限,類設(shè)計(jì)器肯定會(huì)將類的成員設(shè)置為:PUBLIC、PROTECTED、PRIVATE等。根據(jù)實(shí)際使用需要。如果刪除它,將導(dǎo)致那些應(yīng)該被訪問的不能被訪問,而那些不能被訪問的將是多余的。移除方法。對于源代碼和二進(jìn)制文件,刪除一個(gè)抽象的受保護(hù)的方法是兼容的。從功能角度來看,它可能不兼容。那個(gè)方法在那時(shí)被被動(dòng)地放入類中,它應(yīng)該有自己

5、的目的,子類可能會(huì)重載這個(gè)方法,并希望在適當(dāng)?shù)臅r(shí)候被動(dòng)地調(diào)用它。它們的實(shí)現(xiàn)不能被調(diào)用,方法的語義已經(jīng)改變,所以子類不能重載這個(gè)方法。移除或添加類或接口。如果一個(gè)類或接口可以從外部訪問,這意味著它的方法可以被調(diào)用或者它的字段可以被引用。一旦類和接口成為應(yīng)用編程接口,它們之間就沒有區(qū)別了,它們必須存在很長時(shí)間。類和接口之間沒有太大的區(qū)別。類強(qiáng)調(diào)封裝,而接口強(qiáng)調(diào)調(diào)用方法或引用方法。向現(xiàn)有繼承系統(tǒng)添加接口或類可以帶來很多好處:(1)簡化API:不需要公開太多;(2)更均勻地引入它;(3)維護(hù)更方便;例如,公共抽象字符串sayHello();公共抽象字符串sayHelloto(字符串wgo);作者希望簡

6、化這個(gè)API公共抽象類simplehellos的公共抽象字符串say hello();當(dāng)然,以前編寫的類仍然需要維護(hù)。這里只需要維護(hù)公共抽象類hello類擴(kuò)展。工廠方法支持參數(shù)化返回類型(2),公共最終類模板擴(kuò)展對象私有最終類類型;公共模板(類類型,類型=類型;公共類getType()返回類型;/現(xiàn)在怎么辦!公共模板()此(對象.類);工廠方法支持參數(shù)化返回類型(3),公共最終類模板擴(kuò)展對象私有最終類類型;公共模板(類類型,類型=類型;公共類getType()返回類型;已棄用的抑制警告(“未選中”)公共模板()此(類)對象.類);公共靜態(tài)模板創(chuàng)建()返回新模板(對象。類),5.3使所有內(nèi)容不可

7、更改,并且無論它的子類是什么,都不能繼承這個(gè)類。否則,一旦發(fā)布了應(yīng)用編程接口,就會(huì)有各種各樣的方法來使用它,并且會(huì)有很多不可預(yù)測的事情。公共類你好公共無效你好()系統(tǒng).輸出.打印(“你好”);直接公開這個(gè)可繼承的Hello類,會(huì)有很多代碼,直接從外部調(diào)用Hello的Hello方法:公共靜態(tài)空hello () hello hello=新Hello();你好。你好();各種使用模式、開發(fā)人員還可以編寫一個(gè)繼承Hello并重載hello方法的myHello類。代碼如下。私有靜態(tài)類MyHello擴(kuò)展Hello覆蓋公共無效Hello()系統(tǒng). out . println(“Hi”);私有靜態(tài)類超級英雄擴(kuò)

8、展你好覆蓋公共無效你好()超級。你好();系統(tǒng)輸出。打印(“再次你好”);添加方法或字段(1),(1)盡可能少地使用字段:應(yīng)該避免向允許繼承的類或接口添加新的抽象方法。如果是類,請確保該類不能被繼承。(2)添加一個(gè)抽象方法可能不是向后兼容的:如果您向一個(gè)類添加一個(gè)抽象方法,您將迫使它的非抽象子類意識(shí)到它是一個(gè)抽象方法。這種變化不能向后兼容。此處理與源代碼不兼容。6.4添加方法或字段(2)、(3)避免向繼承的類添加新的抽象方法:在改進(jìn)應(yīng)用編程接口時(shí),字段比方法更受約束。這就是為什么您應(yīng)該避免在應(yīng)用編程接口中使用字段。當(dāng)然,使用靜態(tài)和最終聲明的公共字段可以添加到應(yīng)用編程接口中。(4)不要向接口添加

9、非抽象方法:只有類可以添加抽象方法,并且不可能向接口添加非抽象方法。無論您是將一個(gè)方法添加到一個(gè)類還是一個(gè)接口,只要兩者都可以被繼承,這種改變就不可能是100%兼容的。Java中接口和類的區(qū)別,多重繼承:Java接口最突出的特征是多重繼承。因?yàn)槎嘀乩^承可以減少對內(nèi)存的占用。應(yīng)用編程接口中公開的多個(gè)接口可以通過多重繼承使用一個(gè)對象來實(shí)現(xiàn)。類繼承:類繼承只能有一個(gè)父類。此時(shí),如果類之間的一些數(shù)據(jù)需要交換訪問或調(diào)用方法,則只能委托。這將占用大量空間。如果只有一兩個(gè),就不會(huì)那么明顯了。性能考慮不是主要因素。缺點(diǎn)背后的優(yōu)勢(1)向現(xiàn)有接口添加方法總是不容易。為了向后兼容,添加方法不是一個(gè)困難的問題,而是

10、一個(gè)幾乎不可能的任務(wù)。(1)方法維護(hù)麻煩(2)引用麻煩(3)版本保持向后兼容性麻煩,所以改變設(shè)計(jì)方法時(shí)不要抱太大希望:采用多版本命名接口來保持系統(tǒng)兼容。對于不同版本的語言,有必要決定分別支持哪些功能。接口是一個(gè)非常合適的工具、6.6缺點(diǎn)背后的優(yōu)點(diǎn)(2)、公共接口實(shí)例提供公共類實(shí)例類()拋出異常;公共對象實(shí)例創(chuàng)建()引發(fā)異常;將常見問題歸入一個(gè)類別,以提高整體運(yùn)行效率。創(chuàng)建了以下接口:公共接口更好的提供程序擴(kuò)展了實(shí)例提供程序的公共布爾標(biāo)識(shí)(c類);弱點(diǎn)背后的優(yōu)勢(3),如果(更好的提供者的實(shí)例實(shí)例)更好的提供者bip=(更好的提供者)實(shí)例;返回bip . Isinstanceof(string

11、. class);否則返回字符串. class.isAssignableFrom(實(shí)例.實(shí)例類();6.7添加方法(1)的另一種方案禁止繼承類:使用final:將類聲明為final意味著此類不能被繼承。因此,向接口或抽象類添加方法所導(dǎo)致的問題不會(huì)出現(xiàn)在這個(gè)最終類中。因?yàn)樵陬惖亩M(jìn)制文件中,要調(diào)用的方法可以由名稱、參數(shù)和返回值唯一確定,所以不會(huì)有兼容性問題。不要用相同的名稱和相同數(shù)量的參數(shù)來定義一個(gè)方法:就像代碼ThEoObject . add(null)一樣,編譯器會(huì)給出一個(gè)編譯錯(cuò)誤,并且這個(gè)代碼中的方法是不明確的。要避免的方法很簡單,即不要添加具有相同名稱和相同參數(shù)數(shù)量的方法。6.7另一種添

12、加方法的方案(2)。公共最終類實(shí)例提供程序私有最終可調(diào)用實(shí)例;公共實(shí)例提供程序(可調(diào)用實(shí)例)。公共類實(shí)例類()引發(fā)異常返回實(shí)例。調(diào)用()。GetClass();公共對象實(shí)例創(chuàng)建()引發(fā)異常返回實(shí)例。調(diào)用();6.7添加方法(3)的另一種方案,公共抽象類訪問器私有靜態(tài)易失性訪問器默認(rèn);公共靜態(tài)訪問器getDefauIt()訪問器a=DEFAULT如果(a!=空)返回一個(gè);請嘗試類. forName(項(xiàng)目.類. getName(),項(xiàng)目,項(xiàng)目.類. GetClassLoader();catch(異常ex)ex . printstacktrace();返回DEFAULT返回DEFAULT抽象類沒用嗎

13、?在應(yīng)用編程接口中,抽象類一直受到質(zhì)疑。如果在應(yīng)用編程接口中使用抽象類,人們通常會(huì)被動(dòng)地認(rèn)為這是因?yàn)樵O(shè)計(jì)者沒有投入足夠的時(shí)間來合理地設(shè)計(jì)應(yīng)用編程接口。與Java接口相比,Java抽象類還有其他一些優(yōu)勢,即抽象類可以包含靜態(tài)方法。抽象類有用嗎?(2)公共抽象類接口justjoecanimplement受保護(hù)的接口justjoecanimplement () if(! impl.joe.joesImpl 。equals()GetClass()。拋出新的非法狀態(tài)異常(“對不起,不允許您實(shí)現(xiàn)此類”);公共抽象void everyone callthisJowell handlerquest();為了準(zhǔn)備添加參數(shù)(1)來修改應(yīng)用編程接口,最常見的問題是如何通過添加方法的參數(shù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論