为什么你没有考虑子类化,而不是使用类别或协议?在这里,您可以简单地创建一个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