2009-01-14 30 views

回答

2

委託是一種面向對象的設計模式。 Java中的一個例子是維基百科:Delegation Pattern

+0

感謝您的鏈接。它是否像包裝另一個對象一樣簡單 - 並暴露這些相同的方法,但具有(稍微)不同的行爲?我對代表團的理解(非常有限)是Objective-C中的頭等概念。 – 2009-01-14 20:54:41

+0

這不是頭等艙。這只是Cocoa的一個常見設計模式。沒有什麼特別的。 – robottobor 2009-01-14 20:59:14

+0

這在Objective C中更容易實現,因爲它更容易檢測任意對象是否有你想調用的方法(而不是真正稱爲「選擇器」的方法),這使得可以方便地使用包含對象的可選方法(被包裝的物體通常被稱爲「代表」)。 – 2009-01-18 04:49:28

9

委託只是一種避免必須像表視圖那樣對象進行子類化以實現特定於應用程序的行爲,而是將該責任放在控制器上的方法。在創建表視圖時,爲其分配一個控制器對象,該控制器對象實現了一組定義的方法(其中一些可能是必需的,其他可能是可選的)。當表格視圖需要數據或必須決定如何顯示自己時,它會詢問委託人是否實現了適當的方法,並在它做出決定時調用它。

+0

謝謝。在你的例子中,你爲控制器提供了一個委託。該委託包裝表視圖將與之交互的控制器。正確?在Java中,您可以讓委託實現與常規控制器相同的接口。 Objective-C中有這個概念嗎? – 2009-01-14 21:38:25

4

下面是一種思考代表的方式 - 在OOP典型示例中,我有一個汽車對象。我不想再次繼承它,我只是想按原樣使用它,所以我如何使它像雪佛蘭或野馬一樣行事?我給它一個代表。

我的車將有方法來驅動,方法按喇叭等

我的代表將有一個像「什麼是我的最高速度」和「什麼是喇叭聽起來像」和「是我的窗戶有色」的方法

所以,當我打電話給我的汽車對象(不是子類別)時,該方法會調用我的代理的topSpeed方法,並且代表告訴它120英里每小時,所以汽車知道應該多快而不必野馬。

目標C

通常有它定義了一個委託應迴應,即我的車對象的代表將有一個協議,聲明如下協議:

@protocol carDelegate 

-(int)carTopSpeed; 
-(UIColor*)carColor; 
-(BodyShape*)carBodyShape; 
-(DragCoefficient*)carDragCoefficient; 
-(HoodOrnament*)carHoodOrnament  

@optional 
-(BOOL)windowsTinted; 

@end 

然後你就可以讓自己的對象,符合本協議(實現所有必需的方法,以及根據需要看到的任何可選方法)

而汽車對象會希望將一個(id)作爲代表傳遞給它。

然後汽車對象設法避免被分類,並且仍然可以根據用戶的需求行事。