是否可以为必须覆盖的方法创建警告?

时间:2013-12-05 20:33:41

标签: objective-c clang pragma

我正在阅读Creating an abstract class in Objective-C,我对这个类的“抽象性”仅在运行时强制执行这一事实并不十分满意。如果方法没有在子类中实现,我希望能够显示一些警告。理想情况下,这可以缩减为一个或两个#define s。

是否巧妙地使用了__attribute((available,deprecated,etc))__#warning以及可以实现此目的的一些谨慎#pragma clang diagnostic push

我认为这是可能的;我只是不太了解Clang想出来的。

编辑:

没有必要告诉我应该使用协议。我已经将它们用于此目的。我更好奇的是,是否可以完成(了解Clang的更多信息),而不是是否应该完成。

我认为这与NSManagedObject的方式类似,要求将属性标记为@synthesized@dynamic。我已对此进行了研究,我发现在NSManagedObject.h中,该类标记为NS_REQUIRES_PROPERTY_DEFINITIONS,在__attribute__((objc_requires_property_definitions))中转换为NSObjCRuntime.h。是否有一些创造性的使用这些内置#define可以使这项工作?

编辑#2:

对于那些说抽象超类不是Objective-C方式的人,我会引导你去documentation for UIMotionEffects

  

子类注释

     

此类是抽象的,无法实例化   直接

2 个答案:

答案 0 :(得分:4)

我更喜欢NSException方法(这是一个运行时,而不是编译时错误)。

在你的超类中:

@interface NSSuperclass : NSObject

- (void)execute;

@end


@implementation NSSuperclass

- (void)execute
{
    @throw [NSException exceptionWithName:NSInternalInconsistencyException
                                   reason:[NSString stringWithFormat:@"Called %@ on superclass NSSuperclass, this should only be called on subclasses", NSStringFromSelector(_cmd)]
                                 userInfo:@{@"object": self}];
}

@end

然后在子类中重写此方法。

答案 1 :(得分:3)

我选择protocol

未经测试的代码,想法是使用协议类型(可能与类类型结合)而不仅仅是类类型。

@interface BaseClass : NSObject

- (void)foo;

@end

@protocol BaseClassProtocol : NSObject

@required
- (void)bar;

@end

@interface SubClass : BaseClass <BaseClassProtocol>

@end

@interface SubClass2 : BaseClass // no <BaseClassProtocol>

@end

// some code

BaseClass <BaseClassProtocol> * obj = [SubClass new]; // good
BaseClass <BaseClassProtocol> * obj = [SubClass2 new]; // warning
相关问题