我有一个基类SLBaseViewController
,它是UIViewController的子类,并希望它的所有子类都符合协议:
@protocol SLLocalizable <NSObject>
- (void)localize;
@end
问题是我不需要SLBaseViewController
符合协议本身,但我需要编译器警告我,如果子类不符合。
我尝试过:
像这样定义基类:
@interface SLBaseViewController : UIViewController <SLLocalizable>
在这种情况下,编译器告诉我SLBaseViewController
没有实现localize
方法。
让localize
可选。
编译器保持沉默。但那不是我需要的。
有没有一种简单的方法来实现我的目标?
答案 0 :(得分:1)
除了在子类本身中指定子类之外,您不能指定子类实现任何协议。
搜索子类以编辑它们(而不是试图记住每个子类)。反射搜索将能够找到不提供协议名称的子类。
作为一个安全检查,如果超级类被调用,则抛出异常,这样你就知道什么时候错过了什么。显然这只适用于测试期间。
如果这让你变得偏执,你可以尝试编写gets all the subclasses并在其上调用localize
的单元测试。
答案 1 :(得分:1)
在什么情况下你需要所有子类来实现某些东西,但是不需要公共超类来实现它?
如果SLBaseViewController
是一个不打算直接实例化的抽象类,你可以简单地让它实现-localize
,并在正文中抛出一个异常。或者,你可以简单地忽略警告(毕竟这只是一个警告)。