为什么你不考虑子类化,而不是使用类别或协议?在这里,您可以简单地创建一个定义面板动画方法的 AbstractViewController 类(继承自 UIViewController),然后从抽象类派生您自己的具体控制器(PanelAViewController、PanelBViewController 等)。
抽象类将定义方法,并最终在实现中定义一些存根(取决于您是否希望 PanelA 和 PanelB 应该调用 super 或不调用)。这取决于您要赋予抽象类的抽象程度。请参阅下面的代码示例。
有时不清楚使用协议或子类或委托机制是否更好。大多数时候边界并不明确,最终决定更多地取决于程序员的偏好,而不是“编码”的架构规则。通常,当您希望不同对象对某些任务具有共同行为时(例如:您有一组复杂的实体,其中一个实体应用作地图注释:在这种情况下,您必须简单地提供此特定实体) 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");
}