Objective-C中抽象类和接口的区别

Evg*_*ban 16 objective-c

关于iOS开发人员访谈的最常见问题之一是 - 抽象类和界面之间的区别.

我不知道答案,我也不知道答案.当您声明方法时,接口是类的一部分.它可以对其他类(public,.h文件)开放或隐藏在实现中.

抽象类是一个类,它只用于创建隐藏的子类,它不应该有自己的init方法(如果我理解正确的话).

那么,这个问题的答案到底是什么?这个问题意味着什么?

我确实花了很多时间寻找答案,但答案与Obj-C无关,所以我不知道自己.

我希望有人可以提供明确的答案,这个问题对那些想要通过面试的人有所帮助.

Ear*_*rey 70

解决这个问题的一个好方法是首先在一般编程理论中考虑它,然后在更具体的Objective-C上下文中考虑它.


抽象类 - 是一个纯粹用于子类化的类,不能实例化它.抽象类声明了一些东西,并且还有实现.

有这种特殊课程的原因是什么?它以现实生活为蓝本!:)想象一下抽象 - 一种动物.每只动物有什么共同之处?他们都活着(并且可以死).他们需要吃饭.可以在太空中移动.这些特征是所有动物的共同特征和基础.我没有听说过一种不需要食物,不能移动和永生的动物.除此之外,各种动物之间存在很多根本不同的差异.

没有动物星球这是对纯粹的抽象动物那样.那些基本行为,特征根本不足以成为一个具体的动物.有一个隐含的原则,即作为一个具体的动物,你必须有一些额外的特征,除了那些基本的.

现在,在编程中,我们需要以某种方式

  • 表达这些基本原理(界面声明)
  • 有一种描述它们如何工作的方式(实施)
  • 将它们归因于一个类
  • 防止实例化
  • 确保任何混凝土动物都有它们(继承)

我们知道,这些基本原理是什么(声明的公共接口),我们在实践中知道它们如何具体地表现出来(实现那些声明的特征).我们希望它们被所有具体实体继承.所以我们在抽象类中这样做,因为它满足了我提到的这些条件.它包含所有基础,有它们的实现,但不能自己实例化.

抽象类是对一组相关实体的抽象,它们捕获所有这些实体之间的根本共同点.告诉我们它是如何完成的......并确保所有更具体的实体将继承这一点.


界面 - 更少.让我们有一个真实的比喻.人,机器人,动物,风(自然的力量).有些人可以唱歌.机器人具有嵌入的语音合成器模块,因此它可以唱歌.触摸我的teracce玻璃的秋风"唱歌"我可以告诉你很多.而Tinka(撕裂)我的狗,实际上也是一个好歌手.

但实际上,这四者之间的"唱歌"是唯一的共同点 - 你可以听到它听起来像是悦耳的声音.这四个人的歌唱如何发生,在现实中有很大不同.(实现)

另一个复杂因素是,当然并非所有人,狗,风或动物都能唱歌.其中一些可以.

那么我们如何在编程中反映这种情况呢?通过接口:)

您可以拥有一个被调用的接口"SingInterface",在我们的例子中,它声明了一个行为/特征/功能sing.界面简单地声明了一些东西,就是这样.接口没有说明如何完成,没有具体的实现.也没有说谁能做到,界面中的特征不仅限于一种类型或一类.(见http://www.nasa.gov/centers/goddard/universe/black_hole_sound.html)

界面是1到N个特征/功能的列表,不知道它们将如何具体实现,以及可以任意地(对于谁来说没有规则)的特征/功能列表可归因于来自完全不同的不同集合的实体(动物)或机器人).

面向对象编程借鉴了现实生活中的许多概念.这就是为什么这些类比如此有效.


在Objective C中,与其他一些语言(C#等)相反,

抽象类没有语言级支持.这是不可能的,以强制执行一类是在编译过程中抽象.一个类只是按照惯例抽象,并且由开发人员尊重该约定.

至于接口,在目标C中使用"协议"一词.对于同一事物,它只是一个不同的词.

在目标C你可以

因此,甚至可能存在这样的情况,即您的类是抽象类的子类,并且它也符合某些协议.

  • @Earl Gray真是棒极了!顺便说一句,你应该试着写一本书,我绝对会喜欢它. (2认同)