转发协议@子类必需

问题描述

| 我有
@interface SuperClass : UIViewController <UITableViewDelegate,UITableViewDataSource>
接着
@interface SubClass : SuperClass
SuperClass
没有实现implemented3ѭ所必需的协议方法。 是否可以防止警告(例如说SuperClass实现不完整)? 可以在
SubClass
中进行@required警告验证,而不是在
SuperClass
中实现empty / nil方法?     

解决方法

        不,您要的是本质上是抽象类,在Objective-C中不存在。 最好的选择是对基类中的方法进行存根以引发某种异常。     ,        您可能没有在超类中声明采用协议,但是在所有子类中都要求遵守。这可以通过在您的超类中实现
+initialize
来实现,如下所示:
+ (void)initialize
{
  if (self != [SuperClass class] && 
      ![self conformsToProtocol:@protocol(UITableViewDelegate)])
  {
    @throw [NSException ...]
  }
}
这样,每当初始化
SuperClass
的子类时,如果不符合
<UITableViewDelegate>
它将抛出异常。将其放在超类中之后,这不需要进一步的工作。     ,        如果
SuperClass
不符合
UITableViewDelegate
等协议,则不应在.h中包含它。 您可以简单地将协议移至
SubClass
。     ,        是的,可以使用私有类扩展。 例子1 超类
@interface Superclass : UIViewController
@end
超类
@interface Superclass()<UITableViewDelegate,UITableViewDataSource>
@end

@implementation Superclass
// implement interface methods
@end
子类
@interface Subclass : Superclass<UITableViewDelegate,UITableViewDataSource>
@end
更进一步,您可以将私有类扩展名移动到私有头Superclass + Private.h中,然后其他内部类也知道它也实现了它们。 例子2 超类+私人
#import \"Superclass.h\"

@interface Superclass()<UITableViewDelegate,UITableViewDataSource>
@end
超类
#import \"Superclass+Private.h>

@implementation Superclass
// implement interface methods
@end
注意 该技术有一个局限性,它阻止您重写和调用子类未实现其子类的方法。对于这些方法,我建议使用UIGestureRecogniser子类模式。