2012-06-02 39 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

相关问题