2014-02-21 127 views
4

我對我的UIViewControllers(我們稱之爲MyViewController)有一種抽象類,它覆蓋了一些基本方法,如viewDidLoadviewDidDisappear。在這種方法中做了一些準備工作,比如爲導航欄設置顏色,或者準備酒吧按鈕或類似的東西。在Objective-C中模擬多重繼承

現在我想要我的UITableViewControllers這個基本行爲。所以我做了一個新類,它繼承了UITableViewController(我們稱之爲MyTableViewController)並複製了MyViewController的99%的代碼。

UML diagram of the current situation

在這張圖片你看我現在的架構。列出的是重載方法,其中調用其他私有方法。再次,MyViewControllerMyTableViewController共享99%的代碼庫(唯一不同的是類和超類的名稱)。

由於顯而易見的原因,這是廢話。

有沒有一個優雅的解決方案,使MyTableViewControllerMyViewControllerUITableViewController的子類?

回答

4

這是一個建議,但我不知道它是多麼有用,因爲我不知道你的代碼。

您可以在UIViewcontroller類的類別中實現一堆方法。例如:

@implementation UIViewController (myCategory) 
- (void)setupColors; 
... 
@end 

由於MyViewcontroller和MyTableViewcontroller無論從UIViewController的繼承,他們將繼承你的方法。

在這兩個實現中你將複製的唯一東西就是這些函數的調用,但重複的代碼會少得多。

- viewDidLoad... 
{ 
    [self setupColors]; 
} 

只是要小心,如果重寫方法,因爲你不能調用[超級...]一個類別,你可以在繼承的類

+0

對於少數類可能會有效。但是我必須爲每個子類複製/粘貼50行。只要我有5個以上的子類,這個解決方案將會有更多的代碼複製。 – Marc

+0

50行不是那麼多。無論如何,你會意識到,與其他任何替代方案(我認爲其中一些),你仍然需要複製一些代碼。 – Merlevede

+0

50行* n個子類=巨大數字imo。但是,到目前爲止你已經完成了。 – Marc

1

爲常見的方法共同實施可以做無論是一個類別或組成。由於一個類不能用來直接覆蓋現有的接口(例如viewDidLoad :),所以你需要將你的私有方法放到類別中,並從你的子類覆蓋中調用它們。另一種選擇是把你的共享實現一個單獨的類(這可能是一個單身)和撰寫者的一個實例既是MyViewController和MyTableViewController,例如一個屬性:

@interface MyViewController : UIViewController 
@property (nonatomic, strong) MyControllerStyler *controllerStyler; 
@end 

@implementation MyViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [controllerStyler viewDidLoad]; 
} 
...etc... 

所構成的類的方法可以參考如果需要的控制器,如:

@interface MyControllerStyler : NSObject 

- (void)viewDidLoadInController: (UIViewController *)controller; 
...etc... 

雖然一個類別,似乎在這個例子中完全正常,如果您的擴展集體代表您的設計有意義的單位(如視覺造型屬性的集合)可能會爭論的單獨的對象(或對象)以更好地表示您的意圖。