這個界面的含義是什麼?即使我們在一個類上實現了一個接口,每次我們在不同的類上實現它時,我們也必須一次又一次地聲明它的功能,所以接口存在於as3或任何其他具有接口的語言中的原因是什麼。 謝謝界面在Actionscript-3和其他語言中存在的原因是什麼
回答
接口對OOP很重要,特別是在開發大型應用程序時。一個例子是如果你需要一個數據層來返回用戶的數據。如果你最終改變了數據的獲取方式,比如你從XML Web服務數據開始,然後切換到一個平面文件或者其他東西,那怎麼辦?如果爲數據層創建了接口,則可以創建另一個類來實現它,並對數據層進行所有更改,而無需更改應用程序層中的代碼。我不知道你是否使用Flex或Flash,但使用Flex時,接口非常有用。
接口是一種定義類功能的方法。當你單獨工作(尤其是開始)時,可能沒有什麼意義,但是當你開始在一個團隊中工作時,它可以幫助人們理解你的代碼是如何工作的以及如何使用你編寫的類(同時保持你的代碼封裝)。在我看來,這是在中間層面考慮他們的最佳方式。
我基本同意迄今發佈的答案,只是有點補充。
首先回答簡單的部分,是的其他語言有接口。爪哇馬上想到,但我很確定所有的OOP語言(C++,C#等)都包含一些創建接口的機制。
正如Jake所述,您可以將接口編寫爲「合同」,以實現將分離工作的內容。假設我正在處理A並且你正在處理C,而bob正在處理B中。如果我們將B'定義爲B的接口,我們可以快速且相對容易地定義B'(相對於定義B,實施),一切都按照我們的方式進行。我可以假設從A我可以編碼到B',你可以從C中假設你可以編碼爲B',而當bob完成B時,我們可以插入它。
這涉及Jugg1es點。通過「依賴注入」可以更輕鬆地完成整個功能塊的切換(如果您不知道這個短語,請通過Google進行)。這是描述的確切的東西,你創建一個接口,通常定義什麼會做什麼,比如數據庫連接器。對於所有數據庫連接器,您希望它能夠連接到數據庫並運行查詢,因此您可以定義一個接口,指出類必須具有「connect()」方法和「doQuery(stringQuery)」。現在讓我們說Bob爲MySQL數據庫編寫實現,現在您的客戶說我們剛剛爲新服務器支付了20萬美元,他們將運行Microsoft SQL,以便利用您的軟件來利用這些優勢,所有您需要做的就是換出數據庫接口。
在現實生活中,我有一個朋友在芝加哥經營一家肉類包裝/分銷公司。這家公司爲軟件/硬件設置掃描軟件包並在進出庫存時對其進行權衡,告訴他們必須升級到更新的操作系統/服務器和更新的硬件才能與軟件保持一致。該軟件不是以模塊化方式編寫的,可以保持向後兼容性。我曾經在這艘船上待過很多次,告訴某人xyz需要升級才能獲得abc功能,這將使我的工作變得容易90%。無論如何猜測在現實世界中的人們並不總是利用這些東西,它可以咬你屁股。
儘管現有的答案非常好,但我認爲他們錯過了在ActionScript中使用接口的主要優勢,那就是您可以避免將該接口的實現編譯到主文檔類中。
例如,如果您有一個ISpaceShip
接口,您現在可以選擇做幾件事來填充鍵入該接口的變量。您可以加載一個外部swf,其主文檔類實現了ISpaceShip。一旦加載器的contentLoaderInfo
的COMPLETE事件觸發,您將content
投射到ISpaceShip,並且該實現(不管它是什麼)永遠不會編譯到您的加載swf中。這使您可以在加載過程發生時將實際內容放在用戶面前。
出於同樣的原因,您可以在父類AS類的ISpaceShip中聲明一個時間線實例,並在第N幀的導出操作中檢查。在預加載的時候,你不再需要對此進行解釋,做到這一點有足夠的東西,突然間你甚至不需要一個預加載程序
編碼到接口的另一個優點是,如果你正在做單元測試你的代碼,你應該除非你的代碼是完全微不足道的。這樣就可以確保代碼是成功還是失敗在自身的優點,不是基於合作者,或者合作者是不恰當的優劣測試。例如如果你有一個設計用於控制特定類型的視圖控制器,你不會想實例化用於測試的全貌,而只是使用於測試的不同的功能。
如果你沒有在編寫測試你的工作情況的支持,編碼,接口有助於確保一旦你在那裏你可以編寫測試點你的代碼將測試。
以上答案都非常好,我想補充的唯一的事情 - 這可能不是像AS3語言,其中有幾種類型化的集合類(數組,對象和字典)和對象/立即清除動態類 - 就是它是按類型對不同對象進行分組的手段。
一個簡單的例子:
圖片你有一個空間射擊遊戲,玩家擁有導彈,鎖定到各種目標。假設,爲了這個目的,你想這可能被鎖定在有內部功能用於登錄本(又名接口)的任何類型的對象:
function lockOn():void;//Tells the object something's locked onto it
function getLockData():Object;//Returns information, position, heat, whatever etc
這些目標可以是任何東西,一系列完全不相關的類的 - 敵人,朋友,通電,健康。
一個解決方案是讓它們都從包含這些方法的基類繼承 - 但敵人和健康拾取在邏輯上不會共享一個共同的祖先(並且如果您發現自己製作了奇異的繼承鏈來滿足您的需求!那麼你應該重新考慮你的設計),你的導彈也需要對象的引用,其鎖定在:
var myTarget:Enemy;//This isn't going to work for the Powerup class!
或
var myTarget:Powerup;//This isn't going to work for the Enemy class!
...但如果所有可鎖定類實現ILockable界面,喲您可以將其設置爲類型參考:
var myTarget:ILockable;//This can be set as Enemy, Powerup, any class which implements ILockable!
..並具有上述功能作爲接口本身。他們跑要比數組快,但只允許一個單一類型的元素 - -
他們使用Vector類(名字可能會誤導你,它只是一個數組)時是也得心應手,並再次,接口可以被指定爲類型:
var lockTargets:Vector.<Enemy> = new Vector.<Enemy>();//New array of lockable objects
lockTargets[0] = new HealthPickup();//Compiler won't like this!
但是這...
var lockTargets:Vector.<ILockable> = new Vector.<ILockable>();
lockTargets[0] = new HealthPickup();
lockTargets[1] = new Enemy();
意志,提供Enemy
和HealthPickup
實施ILockable
,工作得很好!
- 1. 在其他語言中最接近Apache Hadoop的是什麼?
- 2. 爲什麼Erlang和其他函數編程語言不是原生的c/C++?
- 3. 什麼是斷言失敗的原因
- 4. 什麼是「其他」問題Nsight Profiler顯示的問題原因?
- 5. 導致無法取消任務的其他原因是什麼?
- 6. GAE是什麼原因使用其他的Key for Id?
- 7. 在帶賦值原因的條件語句中,false!==是什麼?
- 8. 下面的代碼在javascript中輸出的原因是什麼
- 9. 顯示「選擇語言」界面的最佳方法是什麼?
- 10. 在其他語言中使用什麼bean模式名稱
- 11. 是什麼原因
- 12. MFMessageComposeViewController中的界面語言
- 13. 界面在Go中的工作原理是什麼?
- 14. 芝麻中存在多個ID語句異常的可能原因是什麼?
- 15. <?>在Java或其他編程語言中的含義是什麼?
- 16. ,有什麼方法的等同物在其他語言
- 17. WIQL和其他語言
- 18. WebAssembly,JavaScript和其他語言
- 19. 什麼是混合Ruby和其他語言的最佳方式? (特別是C++)
- 20. 界面文件中不存在什麼?
- 21. BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE的原因是什麼?
- 22. 'System.IO.IsolatedStorage.IsolatedStorageException'的原因是什麼?
- 23. RejctedExecutionException的原因是什麼?
- 24. 什麼是UnsatisfiedLinkError的原因?
- 25. UnsupportedClassVersionError的原因是什麼?
- 26. ChangeConflictException的原因是什麼?
- 27. 將常量放在if語句之後的原因是什麼?
- 28. 在String的hashCode()中,offset的存在是什麼原因?似乎是多餘的
- 29. 在angular2中使用process.env.NODE_ENV和process.env.ENV變量的原因是什麼?
- 30. 「OutOfMemoryError」的其他原因?