如何使所有子类必须符合协议?

时间:2013-09-01 07:12:48

标签: ios objective-c protocols

我有一个基类SLBaseViewController,它是UIViewController的子类,并希望它的所有子类都符合协议:

@protocol SLLocalizable <NSObject>

- (void)localize;

@end

问题是我不需要SLBaseViewController符合协议本身,但我需要编译器警告我,如果子类不符合。

我尝试过:

  1. 像这样定义基类:

    @interface SLBaseViewController : UIViewController <SLLocalizable>
    

    在这种情况下,编译器告诉我SLBaseViewController没有实现localize方法。

  2. localize可选。

    编译器保持沉默。但那不是我需要的。

  3. 使每个子类符合协议本身。这似乎是一种正确的方法,但我有超过50个子类,而且还有很长的路要走。
  4. 有没有一种简单的方法来实现我的目标?

2 个答案:

答案 0 :(得分:1)

除了在子类本身中指定子类之外,您不能指定子类实现任何协议。

搜索子类以编辑它们(而不是试图记住每个子类)。反射搜索将能够找到不提供协议名称的子类。

作为一个安全检查,如果超级类被调用,则抛出异常,这样你就知道什么时候错过了什么。显然这只适用于测试期间。

如果这让你变得偏执,你可以尝试编写gets all the subclasses并在其上调用localize的单元测试。

答案 1 :(得分:1)

在什么情况下你需要所有子类来实现某些东西,但是不需要公共超类来实现它?

如果SLBaseViewController是一个不打算直接实例化的抽象类,你可以简单地让它实现-localize,并在正文中抛出一个异常。或者,你可以简单地忽略警告(毕竟这只是一个警告)。