我正在阅读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
可以使这项工作?
对于那些说抽象超类不是Objective-C方式的人,我会引导你去documentation for UIMotionEffects
:
子类注释
此类是抽象的,无法实例化 直接
答案 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