爲什麼你沒有考慮子類化,而不是使用類別或協議?在這裏,您可以簡單地創建一個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");
}
偉大的答案,我打勾這一個,因爲答案中的明顯努力。感謝stackoverflow的領主。 – elliotrock