|
|
1
625
通常情况下,Objective-C类只是按照惯例抽象的,如果作者将某个类作为抽象类进行文档记录,那么不要在不进行子类化的情况下使用它。然而,没有编译时强制来阻止抽象类的实例化。实际上,没有什么可以阻止用户通过类别(即在运行时)提供抽象方法的实现。通过在抽象类中的这些方法实现中引发异常,可以强制用户至少重写某些方法:
如果你的方法返回一个值,它会更容易使用
因此,您不需要从方法中添加返回语句。 如果抽象类实际上是一个接口(即没有具体的方法实现),使用Objective-C协议是更合适的选择。 |
|
2
267
不,不能在Objective-C中创建抽象类。 您可以通过使方法/选择器调用doesNoteCongnizeSelector来模拟抽象类,从而引发异常,使类不可用。 例如:
您也可以为init执行此操作。 |
|
|
3
60
只需快速浏览一下@barry wark上面的答案(并更新为iOS 4.3),然后留下这个供我自己参考:
那么在你的方法中你可以使用这个
|
|
4
41
我提出的解决方案是:
通过这种方式,编译器会对协议中任何未由子类实现的方法发出警告。 它不像Java那样简洁,但您确实得到了所需的编译器警告。 |
|
5
34
Objy-C不具有像Java那样的抽象编译器构造。 这次。 所以你所要做的就是将抽象类定义为任何其他普通类 并为抽象方法实现方法存根 空或报告不支持选择器。例如。。。
我还执行以下操作以防止对摘要的初始化 通过默认初始值设定项初始化。
|
|
|
6
21
不要试图创建一个抽象基类,而是考虑使用一个协议(类似于Java接口)。这允许您定义一组方法,然后接受所有符合协议的对象并实现这些方法。例如,我可以定义一个操作协议,然后具有如下功能:
其中op可以是实现操作协议的任何对象。 如果您需要抽象基类做的不仅仅是定义方法,那么您可以创建一个常规的Objective-C类并防止它被实例化。只需重写-(id)init函数并使其返回nil或assert(false)。这不是一个非常干净的解决方案,但是由于Objective-C是完全动态的,所以实际上没有直接等价于抽象基类的方法。 |
|
|
7
19
这条线有点旧,我想分享的大部分已经在这里了。 然而,我最喜欢的方法没有被提及,而且在当前的clang中,afaik没有本地支持,所以我来这里讨论一下。
首先,也是最重要的(正如其他人已经指出的那样),抽象类在目标中是非常罕见的——我们通常使用组合(有时通过委托)来代替。这可能就是为什么除了
但考虑到这一点(在仔细评估了你的处境之后!)您得出的结论是,代表团(或一般组成)不太适合解决您的问题,这里是 我 做到这一点:
我个人更喜欢宏版本,因为它允许我尽可能地减少样板文件。 这里是:
如您所见,宏提供了抽象方法的完整实现,将必要的样板文件数量减少到绝对最小。 一个更好的选择是 lobby the Clang team 通过功能请求为这种情况提供编译器属性。(更好的方法是,因为这样还可以为那些子类(如nsincrementalStore)的场景启用编译时诊断。) 我为什么选择这个方法
最后一点需要解释,我想: 一些(大多数?)人们在发布版本中去掉断言。(我不同意这个习惯,但那是另一个故事,没有实现一个必要的方法,但是 坏的 , 可怕的 , 错误的 和 基本上是宇宙的尽头 为你的计划。在这方面,您的程序无法正常工作,因为它是未定义的,而未定义的行为是有史以来最糟糕的事情。因此,能够在不生成新诊断的情况下删除这些诊断将是完全不可接受的。 对于这样的程序员错误,您无法获得适当的编译时诊断,这已经够糟糕了,并且必须在运行时对这些错误进行发现,但是如果您可以在发布版本中对其进行粘贴,那么为什么首先尝试使用抽象类呢? |
|
|
8
12
使用
|
|
|
9
7
在Xcode中(使用clang等),我喜欢使用
它提供了一些防止意外使用该方法的保护。 例子
在基类中
更进一步,我创建了一个宏:
这样可以做到:
正如我所说,这不是真正的编译器保护,但它和您使用不支持抽象方法的语言一样好。 |
|
|
10
7
问题的答案分散在已经给出答案的评论中。所以,我只是在这里总结和简化。 选项1:协议如果要创建不带实现的抽象类,请使用“协议”。继承协议的类必须实现协议中的方法。
选项2:模板方法模式如果您想创建一个抽象类,并使用“模板方法模式”之类的部分实现,那么这就是解决方案。 Objective-C - Template methods pattern? |
|
|
11
6
另一种选择 只要检查抽象类中的类,并断言或异常,不管您喜欢什么。
这样就不必重写
|
|
|
12
5
(更多相关建议) 我希望有一种方法让程序员知道“不要从孩子那里调用”,并完全重写(在我的情况下,在不扩展时仍然代表家长提供一些默认功能):
其优点是程序员将在声明中看到“override”,并且知道不应该调用
当然,必须为此定义单独的返回类型是很难看的,但它提供了足够好的视觉提示,您很容易就不能在子类定义中使用“override_uuu”部分。 当然,当扩展是可选的时,类仍然可以有一个默认实现。但和其他答案一样,在适当的时候实现一个运行时异常,比如抽象(虚拟)类。 最好是有这样的内置编译器提示,甚至提示什么时候最好调用super的实现,而不是必须挖掘注释/文档或…假定。
|
|
13
4
如果您习惯于编译器捕获其他语言中的抽象实例化冲突,那么objective-c行为是令人失望的。 作为一种后期的绑定语言,显然Objective-C不能对类是否是抽象的(您可能在运行时添加函数…)做出静态决策,但对于典型的用例,这似乎是一个缺点。我更喜欢编译器完全阻止抽象类的实例化,而不是在运行时抛出错误。 下面是一个模式,我们使用一些技巧隐藏初始值设定项来获取这种类型的静态检查:
|
|
|
14
3
可能这种情况只应该发生在开发时,所以这可能有效:
|
|
15
3
您可以使用 @ Yar (稍作修改):
在这里,您将收到如下信息:
或断言:
在这种情况下,您将得到:
您也可以使用协议和其他解决方案,但这是最简单的解决方案之一。 |
|
16
2
Cocoa 不提供任何所谓的抽象。我们可以创建一个类抽象,它只在运行时检查,而在编译时不检查。 |
|
|
17
1
我通常只在我想要抽象的类中禁用init方法:
每当您调用该类的init时,这将在编译时生成一个错误。然后,我将类方法用于其他所有内容。 Objective-C没有用于声明抽象类的内置方式。 |
|
|
18
0
通过应用@dottoString的评论,稍微改变一下@redfood的建议,您实际上已经得到了Instagram的解决方案。 IGListKit .
因为
当然,这并不能阻止未经授权的开发人员添加简单引用
现实世界示例:
IListKIT
有一个基类
|
|
19
0
实际上,objective-c没有抽象类,但是可以使用 协议 达到同样的效果。这是样品: 自定义协议.h
测试协议
测试协议
|
|
|
20
0
创建抽象类的简单示例
|
|
|
21
-3
你不能创建一个代理吗? 委托就像一个抽象的基类,从某种意义上说,你需要定义什么函数,但实际上你没有定义它们。 然后,无论何时实现委托(即抽象类),编译器都会警告您需要为哪些可选和强制函数定义行为。 这听起来像是一个抽象的基类。 |
|
|
Rishab Negi · 这个关键字在抽象类中是如何工作的 1 年前 |
|
|
Reelie · C#11-通过抽象类在接口中静态抽象成员? 2 年前 |
|
Denis Steinman · 如何从内部命名空间为类创建别名?复制 2 年前 |
|
|
vimal raj · javascript中类的执行顺序 2 年前 |
|
|
Max · 如何使用抽象/接口类的向量作为函数参数? 3 年前 |
|
|
timurichk · 我的类不重写抽象方法compareTo 8 年前 |