2012-06-02 37 views
0

我有幾個UIViewController的子類,我想使用一個類別爲它們提供所有的幾個方法。事情是我只想要我的班級不是基地UIViewController有類別的方法。如何在幾個自定義類上實現Objective-C類別

說我有:

PanelAViewController 
PanelBViewController 
... 

,我要實現和一類反應:

PanelAnimations 

-(void)animateIn; 
-(void)animateOut; 

我可以使用的協議,每次插入的方法,但它們使用相同的方法和價值觀,所以不會有類別適合?

我只是不知道如何定義這些自定義類的類別。

回答

2

爲什麼你沒有考慮子類化,而不是使用類別或協議?在這裏,您可以簡單地創建一個AbstractViewController類(從UIViewController開始),該類定義面板動畫方法,然後從抽象方法派生自己的具體控制器(PanelAViewController,PanelBViewController等)。

抽象類將定義方法並最終在實現中定義一些存根(如果您希望PanelA和PanelB應該調用超級,則由您決定)。這取決於你想要給抽象類的抽象程度。請參閱下面的代碼示例。

有時不清楚使用協議或子類還是委託機制更好。大多數情況下,邊界不清晰,最終決定更依賴於程序員的偏好,而不是「編纂」的架構規則。通常,當您希望不同的對象對某些任務具有共同行爲時,您可以使用協議(例如:您有一組複雜的實體,其中一個實體應該用作映射註釋:在這種情況下,您必須簡單地提供此特定實體MKAnnotation協議兼容性);當你希望擴展一個類而不用繼承它或者沒有給予最終用戶繼承它的可能性時,委託最常用。在你的情況下,我認爲子類化是最合適的選擇,因爲所有的類都嚴格地屬於相同的類層次結構,它們共享一個共同的代碼(或通用接口)並提供每個專門的實現。



// 
// AbstractViewController.h 
// 

#import 

@interface AbstractViewController : UIViewController 

-(void)doAnimate; 
-(void)didAnimate; 

@end 

// 
// AbstractViewController.m 
// 

#import "AbstractViewController.h" 

@interface AbstractViewController() 

@end 

@implementation AbstractViewController 


-(void)doAnimate { 
    NSLog(@"Abstract do animate"); 
} 

-(void)didAnimate { 
    NSLog(@"Abstract did animate"); 
} 

// 
// ConcreteViewController.h 
// 

#import "AbstractViewController.h" 

@interface ConcreteViewController : AbstractViewController 

@end 

// 
// ConcreteViewController.m 
// 

#import "ConcreteViewController.h" 

@interface ConcreteViewController() 

@end 

@implementation ConcreteViewController 


-(void)doAnimate { 
    [super doAnimate]; 
    NSLog(@"Subclass do animate"); 
} 

+0

偉大的答案,我打勾這一個,因爲答案中的明顯努力。感謝stackoverflow的領主。 – elliotrock

2

看起來像你最好的選擇是從UIViewController派生一個自定義類,稱它爲「MyUIViewControllerBase」。將您的自定義方法添加到該類,然後從其中派生其他視圖控制器。沒有類別需要,它解決了你的問題。

+0

很好的答案,所有這三個來超快。奇怪的,因爲有時候新的工具會讓你忘記OOP久經考驗的方法。謝謝。 – elliotrock

1

假設你可以控制你所有的自定義ViewController,最簡單的方法是創建一個NSViewController的子類 - 比如MyViewController-並且從你的子ViewView控制器中繼承它。這樣你甚至不必爲他們寫一個類別。您可以簡單地在MyViewController內實現您想要的功能。

  NSViewController 
       | 
      MyViewController -- implement your shared methods here 
     /   \ 
MyViewControllerA MyViewControllerB 
+0

謝謝Tharabas – elliotrock

相關問題