转发协议@required到子类

时间:2011-05-31 17:12:33

标签: objective-c

我有:

@interface SuperClass : UIViewController <UITableViewDelegate,UITableViewDataSource>

然后

@interface SubClass : SuperClass

SuperClass没有实现所需的协议方法SubClass 是否可以防止警告(说SuperClass实现不完整)?

而不是在SuperClass中实现空/零方法,是否可以针对SubClass进行@required警告验证?

4 个答案:

答案 0 :(得分:10)

您可能不会在超类中声明协议采用,但要求在所有子类中遵从。这可以通过在您的超类中实现+initialize来完成,如下所示:

+ (void)initialize
{
  if (self != [SuperClass class] && 
      ![self conformsToProtocol:@protocol(UITableViewDelegate)])
  {
    @throw [NSException ...]
  }
}

这样,每当初始化SuperClass的子类时,如果它不符合<UITableViewDelegate>,它将抛出异常。将它放入超类之后,这不需要进一步的工作。

答案 1 :(得分:5)

不,你所要求的基本上是抽象类,在Objective-C中不存在。

最好的办法是将基类中的方法存根,以抛出某种异常。

答案 2 :(得分:0)

如果SuperClass不符合UITableViewDelegate等协议,则不应该在.h。

您只需将协议移至SubClass

即可

答案 3 :(得分:0)

是的,可以使用私有类扩展。

示例1

Superclass.h

@interface Superclass : UIViewController
@end

Superclass.m

@interface Superclass()<UITableViewDelegate, UITableViewDataSource>
@end

@implementation Superclass
// implement interface methods
@end

Subclass.h

@interface Subclass : Superclass<UITableViewDelegate, UITableViewDataSource>
@end

更进一步,您可以将私有类扩展移动到私有标头Superclass + Private.h,然后您的其他内部类也可以知道它也实现了它们。

示例2

超类+ Private.h

#import "Superclass.h"

@interface Superclass()<UITableViewDelegate, UITableViewDataSource>
@end

Superclass.m

#import "Superclass+Private.h>

@implementation Superclass
// implement interface methods
@end

注意 有一个限制,这种技术可以防止你覆盖和调用超类,而子类不是它的超类已经实现的方法。对于这些方法,我建议使用UIGestureRecogniser子类模式。