“你好,阿米戈!今天我想告訴你接口存在的原因。你經常聽到某個類、對像或實體支持特定的接口,支持接口是什麼意思?”

存在支持特定行為的接口 - 1

從廣義上講,任何界面都是一種機制,可以讓某些東西與其他東西交互。例如,電視遙控器是一個遠程接口。狗理解並執行命令,這意味著狗支持語音(控制)界面。總而言之,我們可以說接口是兩個事物交互的標準化方式,雙方都知道該標準。當一個人告訴狗“坐下”時,他或她的命令是“狗語音控制界面”的一部分,如果狗服從命令,那麼我們就說狗支持該界面。

編程中也是如此。方法是對對象及其數據執行的操作。如果一個類實現了某些方法,那麼它“支持執行”某些命令。通過將方法組合到一個接口中我們得到了什麼?

1)每個接口,就像一個類,有一個唯一的名字。雙方都可以 100% 確定對方支持他們知道的確切接口,而不是一些類似的接口。

2)每個接口都對支持它的類施加了一定的限制。當調用從接口繼承的方法時,類(它的開發者)決定它會做什麼,但結果應該在合理預期的範圍內。如果我們命令一隻狗“坐下”,然後它在原地打滾5分鐘然後坐下,那麼它支持界面。但如果它反而抓住了你的腿,那麼我們很難說它支持這個接口。執行命令沒有產生預期的結果。

假設您和您的朋友正在編寫一款電腦遊戲。你被指派為一個角色的行為編程。您的一位同事已經編寫了在屏幕上顯示所有字符的代碼。負責將游戲保存到磁盤的第二位同事編寫了將所有遊戲對象保存到文件的代碼。他們每個人都寫了很多代碼,並製作了一個與這些代碼交互的界面。例如,它可能看起來像這樣:

Java代碼 描述
interface Saveable
{
 void saveToMap(Map<String, Object> map);
 void loadFromMap(Map<String, Object> map);
}
— 用於從地圖存儲/加載對象的接口。
interface Drawable
{
 void draw(Screen screen);
}
— 用於在傳遞的 Screen 對象內繪製對象的接口。
class PacMan implements Saveable, Drawable
{
…
}
— 你的類,它支持兩個接口。

換句話說,要支持任何接口(接口組),您的類必須:

1)繼承它們

2)實現其中聲明的方法

3)方法必須做它們打算做的事情。

然後程序的其餘代碼(對您的類及其對像一無所知)可以與您的類一起工作。

“為什麼代碼對我的類一無所知?”

“假設您從一年前某人編寫的程序中獲取了代碼。或者假設您的朋友從其他人那裡購買/許可了遊戲引擎。您有遊戲的工作代碼。成千上萬的對象相互交互。他們如果您通過您的類已正確實現的接口使交互發生,則可以輕鬆地與您的對象正確交互。”

“太遠了!我不知道那是可能的。”

“所有大項目都是這樣運作的。人們很久以前就不再從頭開始寫作了。”

人們也不會每次都重新發明數學和字母表。相反,他們研究在他們之前發明的一切。