2010-03-09 48 views
0

我有一些功能,我需要從UIView或UIImageView派生的所有類。UIView和UIImageView的通用基類/代碼 - 在Objective-C中替代多重繼承

更具體地說,我有這兩個類都需要的與手勢相關的代碼。
目前我的實現是:

UIGestureView : UIView 
UIGestureImageView : UIImageView 

,使所有類都從這些派生。 這些類將再次包含派生類將實現的方法。

我的問題是手勢處理代碼重複在UIGestureViewUIGestureImageView

這裏的自然的事情(爲C++程序員)將使用多重繼承

UIGestureView : UIView, GestureHandler 
UIGestureImageView : UIImageView, GestureHandler 

,讓GestureHandler執行所有的通用工作,但據我理解這一點是不可能的。

這樣做的目標c的方式是什麼(沒有太多的子級調用父級等)?

只是要強調,問題是如何避免在UIView(或其派生類)和UIImageView(或其派生類)中再次實現相同的代碼兩次。

回答

4

您可以用手勢處理擴展UIView,然後從UIView繼承的每個對象都將擁有所需的方法。雖然不像真棒和子類,但可以在全球範圍內工作。

@interface UIView (GestureHandling) 

- (void)didMoveAFinger:(UITouch*)touchOrWhatever; 
// etc., etc. 

@end 

我有過類似的問題與UIViewControllerUITableViewController。我有一個我想與另一個的子類共享代碼的子類。然而,如果你想要一個子類,那麼沒有通用的地方可以注入這些代碼。另一種選擇是共同超類的類別。

+0

這仍然是我需要的UIImageView相同的行爲不解決代碼重複的問題。 – 2010-03-09 18:55:04

+1

@LK:UIImageView是UIView的子類。 – Chuck 2010-03-09 19:21:09

+0

好的 - 在另一個答案中看到了相同的結果。將檢查出來 - 謝謝! – 2010-03-09 19:23:56

0

您應該嘗試使用協議和委派。他們解決了objective-c中的多重繼承問題。

@protocol MyProtocol <NSObject> 
//Method declarations go here 
@end 

@protocol MyProtocol2 <NSObject> 
//Method declarations go here 
@end 

@interface CustomView : UIView <MyProtocol, MyProtocol2> 
+0

協議不能解決多重繼承問題,因爲它們不包含任何代碼。他們確實爲不相關的類之間的通用接口提供了一個模板,但不要讓你做類似於處理手勢代碼的事情。你仍然需要把代碼放在某個地方。 – 2010-03-09 18:49:08

+0

協議/代表似乎添加了一個額外的圖層回撥 - 我試圖避免這個 – 2010-03-09 18:51:19

1
+0

作爲這裏的其他答案,這允許將代碼添加到現有的類,但不能解決代碼重複的問題,因爲我需要在UIView和UIImageView中都存在完全相同的代碼 – 2010-03-09 18:57:00

+0

由於UIImageView是從UIView繼承的,因此UIView上的類別應該可以解決您的問題。 – kubi 2010-03-09 19:16:50

+0

哦 - 我明白了,會檢查出來 - 謝謝。 – 2010-03-09 19:18:47