在Objective-C中模拟多重继承

时间:2014-02-21 06:48:07

标签: objective-c inheritance architecture multiple-inheritance

我的UIViewControllers(我们称之为MyViewController)有一个抽象类,它覆盖了viewDidLoadviewDidDisappear等基本方法。在这种方法中,做了一些准备工作,比如为导航栏设置颜色,或者准备条形按钮或类似的东西。

现在我想要UITableViewControllers的这个基本行为。所以我创建了一个继承UITableViewController的新类(让我们称之为MyTableViewController)并从MyViewController复制了99%的代码。

UML diagram of the current situation

在此图中,您可以看到我当前的架构。列出的是覆盖方法,其中调用其他私有方法。同样,MyViewControllerMyTableViewController共享99%的代码库(唯一的区别是类和超类的名称)。

由于显而易见的原因,这是废话。

是否有一个优雅的解决方案可以使MyTableViewController成为MyViewControllerUITableViewController的子类?

2 个答案:

答案 0 :(得分:4)

这是一个建议,但我不知道它有多有用,因为我不知道你的代码。

您可以在UIViewcontroller类的类别中实现一堆方法。例如:

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

由于MyViewcontroller和MyTableViewcontroller都继承自UIViewController,因此它们将继承您的方法。

你在两个实现中唯一复制的就是调用这些函数,但重复的代码会少得多。

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

如果你覆盖方法,请小心,因为你不能像继承类那样在类别上调用[super ...]

答案 1 :(得分: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...

虽然此类别的类别看起来非常好,但如果您的扩展程序共同代表您设计的一个有意义的单元(例如视觉样式属性的集合),那么可能会争论单独的对象(或对象)以更好地表示您的意图