问题描述
|
我有:
@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子类模式。