2009-01-29 141 views
0

今天我收到了我的書「Head First Design Patterns」。到目前爲止,雖然有趣的東西,但是我對它的內容有疑問。我沒有Java/C#背景,也不希望立即跳入這些語言(我想首先關注C++)。在書中說,java沒有接口的實現...這將意味着對於每個接口的改變,你將不得不修改實現接口的所有子類。Java:沒有接口實現?

這是如何在C++中完成的?我錯過了什麼?

+0

興趣點:你可能想看看Jeff對Head First Design Patterns的看法。提示:他不是粉絲。 http://www.codinghorror.com/blog/archives/000380.html – 2009-01-29 18:34:50

+0

我發現這本書非常有幫助。大多數初學者似乎寫了一堆意大利麪代碼,當我說「我們在這裏使用模板模式是因爲...」時,我不知道我的意思。授予傑夫有一些有效的觀點,初學者採取了一些簡單的和複雜的(計算機科學它死) – Patrick 2009-01-29 20:55:15

回答

8

本書作者的意思是,如果您更改了接口成員的簽名或添加了新成員,您還需要在實現類中進行這些更改,以便他們繼續實現接口。

只要您使用完全相同的簽名(即具有相同名稱,返回類型以及參數的順序和類型)實現接口的成員,您可以隨意更改實現類。

我的印象是,你不太明白接口是如何工作的,所以我建議你閱讀C# interface specification on MSDN這個問題,我認爲這個問題非常清楚(除了在Java中使用Java之外,它幾乎與Java相同「實現」關鍵字而不是冒號(:)來聲明一個類實現了特定的接口)。

1

Java接口的C++等價物將是一個只有純虛擬方法的類。

你提到你已經「看到了很多這些Runnable/Threadable接口,可以在不觸及這些子類的情況下進行修改」。很難從你的描述肯定地說,但你可能已經見過是這樣的:

Runnable r = new Runnable() { 
    public void run() { 
     // do something here 
    } 
}; 

這是一個實現了Runnable接口的匿名類;它不以任何方式修改接口。

2

...如果你想改變接口中方法的簽名,一個好的IDE(eclipse,netbeans ...)可以幫助你重構實現這個接口的所有類。

1

C++中的情況也是如此。

C++沒有接口關鍵字,但純虛擬類和所有純虛擬方法是相同的想法。

如果您在純虛擬類中更改了方法簽名,則其所有子類都必須遵循才能編譯。

0

interface定義了一個實現接口的類將遵循的合約。這類似於抽象基類 - 它基本上將方法的實現委託給派生類。

是的,如果你修改了界面 - 你將不得不修改所有的類,實現那個接口。我的猜測是,您在Java代碼中看到的Runnable實例是實際實現Runnable的匿名類,而不是修改接口本身。

Runnable myOwnThread = new Runnable() { 
    public void run() { 
    // Do something here 
    } 
}; 

在Java中,不允許修改標準庫中提供的接口(和類)。 C++中的等價物可以是純虛擬類

0

好吧,我會askt他很明顯的問題:

如果你想要做的設計模式在C++中,爲什麼你會讀出比四種Design Patterns書的原岡其他什麼嗎?

是的,具有純虛擬方法的C++類相當於Java或C#接口。