2011-05-23 85 views
16

我已經閱讀了大量有關Objective-C代表的文章和閱讀材料,試圖理解它們。來自Java,他們看起來非常像Java聽衆。例如,假設我在Java中有一個按鈕。當按下按鈕時,我想要發生一些事情。我的代碼可能看起來像這樣:Objective-C代表與Java聽衆

ButtonListener myButtonListener = new ButtonListener();  
someButton.addActionListener(myButtonListener); 
... 

class ButtonListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 

    } 
} 

類似的東西。在objective-c中,我似乎會按照爲我的按鈕調用setDelegate方法並將其作爲委託傳遞給「偵聽器」的方式來執行某些操作。然後,實際的按鈕類可能會檢查該委託是否響應某個選擇器(即actionPerformed)。如果我以正確的方式思考這個問題,那麼代表就像聽衆一樣。那是對的嗎?有什麼重大分歧嗎?

謝謝!

回答

10

你幾乎在那裏的按鈕。唯一真正的區別是obj-c中的委託通常實現多個函數,以便對與它們委派的對象有關的事件執行各種操作。例如,UITextViewDelegate所擁有的方法:

– textViewShouldBeginEditing: 
– textViewDidBeginEditing: 
– textViewShouldEndEditing: 
– textViewDidEndEditing: 

唯一真正的區別,我發現是你不能在線創建您的代表,這樣你可以像Java:

someButton.setOnClickListener (new View.OnClickListener { 
    @Override 
    public void onClick() { 
     //do stuff 
    } 
}); 
+3

從技術上講,使用塊可以使內聯代表。我在我的硬盤上有一個實用程序類... – 2011-05-23 20:57:20

+0

哦,真的,我一直在尋找類似的東西,我正在努力避免爲一個代理函數創建一個全新的類。我很想看看你是如何做到這一點的 – 2011-05-23 20:58:41

+1

你在這裏:標題:http://pastebin.com/Gdg4nsAF主:http://pastebin.com/SGVGCB31。您需要爲每個代表創建一個班級,但是當您需要很多班級時,這有助於減少班級數量。 – 2011-05-23 21:03:45

7

他們是相似的,但不完全相同。委託模式具有更廣泛的定義,並且通常實施定義的任務可以超出單獨收聽。任務可以包括監聽,或者委託的實現可以被定義爲監聽(專有)。

objc代表通常用於避免子類化,並用作偵聽器或數據提供者。委託人所做的事情是由協議定義的 - 它不僅僅是一個聽衆。所以代表可以是數據源/提供者。它只是一種將實現卸載到另一個類的方法,從類中刪除經常定製的應用程序特定實現。

NSButton/UIButton已經通過目標+動作機制專用於這種情況。你會對這個特定的案例使用target + action。

0

我認爲可以在java.util.concurrent pagkage中找到更好的Java模擬代碼:Callable,Future,Executor。

1

委託與偵聽器或觀察者類似,協議與接口類似,只是協議可以定義可選的函數(又名消息)。在Objective C中,您可以使用類別來擴充現有類(無需其源代碼)以採用協議並將其設爲委託,這樣您就不需要創建新的匿名內部類。你不能用Java來做到這一點。