为了账号安全,请及时绑定邮箱和手机立即绑定

在Object-C中创建抽象类

/ 猿问

在Object-C中创建抽象类

阿波罗的战车 2019-07-12 15:55:00

在Object-C中创建抽象类

我最初是一个Java程序员,现在正在使用Object-C。我想创建一个抽象类,但在Object-C中这似乎是不可能的。这个是可能的吗?

如果不是,我在目标C中离抽象类有多近?


查看完整描述

3 回答

?
MYYA

通常情况下,Object-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];

因此,您不需要从方法中添加返回语句。

如果抽象类实际上是一个接口(即没有具体的方法实现),那么使用Object-C协议是更合适的选择。


查看完整回答
反对 回复 2019-07-12
?
繁花如伊

不,无法在Object-C中创建抽象类。

您可以模拟一个抽象类-通过使方法/选择器调用doNotRecognizeSelector:从而引发一个异常,使该类不可用。

例如:

- (id)someMethod:(SomeObject*)blah{
     [self doesNotRecognizeSelector:_cmd];
     return nil;}

您也可以为init这样做。


查看完整回答
反对 回复 2019-07-12
?
白板的微信

我想出的解决办法是:

  1. 在“抽象”类中为您想要的任何东西创建一个协议。
  2. 创建实现协议的基类(或者称其为抽象类)。对于您希望“抽象”的所有方法,请在.m文件中实现它们,而不是在.h文件中实现它们。
  3. 让您的子类继承基类并实现协议。

这样,编译器将对协议中没有由您的子类实现的任何方法发出警告。

它不像在Java中那样简洁,但您确实得到了所需的编译器警告。


查看完整回答
反对 回复 2019-07-12

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信