在Objective中创建一个抽象类
我原来是一名Java程序员,现在可以与Objective-C一起工作。 我想创建一个抽象类,但在Objective-C中看起来不可能。 这可能吗?
如果不是,我可以在Objective-C中得到多近的抽象类?
通常情况下,Objective-C类只是按照惯例抽象 - 如果作者将一个类记录为抽象类,就不要在没有对其进行子类化的情况下使用它。 但是,没有编译时实施可以防止抽象类的实例化。 实际上,没有什么能阻止用户通过类别提供抽象方法的实现(即在运行时)。 您可以强制用户至少通过在抽象类中的这些方法实现中引发异常来重写某些方法:
[NSException raise:NSInternalInconsistencyException
format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)];
如果你的方法返回一个值,使用起来会简单一些
@throw [NSException exceptionWithName:NSInternalInconsistencyException
reason:[NSString stringWithFormat:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)]
userInfo:nil];
因为你不需要从方法中添加返回语句。
如果抽象类真的是一个接口(即没有具体的方法实现),使用Objective-C协议是更合适的选择。
不,在Objective-C中无法创建抽象类。
您可以模拟抽象类 - 通过使方法/选择器调用doesNotRecognizeSelector:并因此引发异常,从而使类不可用。
例如:
- (id)someMethod:(SomeObject*)blah
{
[self doesNotRecognizeSelector:_cmd];
return nil;
}
您也可以为init执行此操作。
只需在@Barry Wark上面的回答(并更新iOS 4.3)即可,并留下以供我自己参考:
#define mustOverride() @throw [NSException exceptionWithName:NSInvalidArgumentException reason:[NSString stringWithFormat:@"%s must be overridden in a subclass/category", __PRETTY_FUNCTION__] userInfo:nil]
#define methodNotImplemented() mustOverride()
那么在你的方法中你可以使用它
- (void) someMethod {
mustOverride(); // or methodNotImplemented(), same thing
}
注意:不确定是否让宏看起来像C函数是个好主意,但我会保留它直到相反。 我认为使用NSInvalidArgumentException
(而不是NSInternalInconsistencyException
)更正确,因为这是运行时系统响应调用了doesNotRecognizeSelector
(参见NSObject
文档)而引发的内容。
上一篇: Creating an abstract class in Objective
下一篇: Closures in Java 7