我有:
@interface SuperClass : UIViewController <UITableViewDelegate,UITableViewDataSource>
然后
@interface SubClass : SuperClass
此SuperClass
没有实现所需的协议方法SubClass
是否可以防止警告(说SuperClass实现不完整)?
而不是在SuperClass
中实现空/零方法,是否可以针对SubClass
进行@required警告验证?
答案 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子类模式。