关于iOS开发人员访谈的最常见问题之一是 - 抽象类和界面之间的区别。
我不知道答案,我也不知道答案。当您声明方法时,接口是类的一部分。它可以对其他类(public,.h文件)开放或隐藏在实现中。
抽象类是一个类,它只用于创建隐藏的子类,它不应该有自己的init方法(如果我理解正确的话)。
那么,这个问题的答案到底是什么?这个问题意味着什么?
我确实花时间寻找答案,但答案与Obj-C无关,所以我无法自己弄明白。
我希望有人可以提供明确的答案,这个问题对那些想要通过面试的人有所帮助。
答案 0 :(得分:69)
解决这个问题的一个好方法是首先在一般编程理论中考虑它,然后在更具体的Objective-C语境中考虑它。
抽象类 - 是一个纯粹用于子类的类,不能实例化它。抽象类声明了一些东西,并且还实现了它。
有这种特殊课程的原因是什么?它以现实生活为蓝本! :) 想象一下抽象 - 一种动物。什么有每个动物的共同点?他们都活着(并且可以死)。他们需要吃。空间中的移动可以。这些特征对所有动物都很常见且基本。我天堂没有听说过一种不需要食物,不能移动和永生的动物。除此之外,各种动物之间存在很多不那么基本的差异。
这个星球上有没有动物 纯粹是一个抽象的动物。那套基本行为,特征根本不足以成为具体的动物...... 有一个隐含的原则,即作为一个具体的动物,你必须有一些额外的特征,除了那些基本的特征。
现在,在编程中,我们需要能够以某种方式
我们知道,这些基本原理是什么(声明公共接口),我们在实践中知道它们是如何具体表现出来的(实现那些声明的特征)。我们希望它们被所有具体实体继承。所以我们在抽象类中这样做,因为它满足了我提到的这些条件。它包含所有基础知识,具有实现,但不能单独实例化。
抽象类是一组相关实体的抽象,它捕获了所有相关实体之间的基本共同点。告诉我们它是如何完成的......并确保所有更具体的实体都将继承它。
界面 - 更少。让我们来做一个真实的比喻。人,机器人,动物,风(自然的力量)。 有些人可以唱歌。机器人嵌入了语音合成器模块,因此可以唱歌。秋风吹着我的teracce glass"唱着"很多我可以告诉你。而Tinka(r.i.p)我的狗,实际上也是一位好歌手。
但是真的,"唱歌"这四者之间有唯一的共同点 - 你可以听到耳朵里听起来很悦耳的声音。这四个人的歌唱如何发生,实际上有很多很多。 (实现)
另一个复杂因素是,当然并非所有人,狗,风或动物都能唱歌。 有些可以。
那么我们如何在编程中反映这种情况呢?通过界面:)
您可以拥有一个名为"SingInterface"
的接口,在我们的示例中,它声明了一个行为/特征/功能,它是sing
。界面只是简单地声明了一些东西。界面没有说明如何完成,没有具体的实现。也没有说谁能做到,界面中的特征不仅限于一种类型或一类。 (见http://www.nasa.gov/centers/goddard/universe/black_hole_sound.html)
接口是一个1到N个特征/功能的列表,不知道它们将如何具体实现,以及可以任意设置的特征/功能列表(对于谁来说没有规则)可归因于来自不同集合的实体根本不同(动物或机器人)。
面向对象编程借鉴了现实生活中的许多概念。这就是为什么这些比喻如此有效。
在Objective C 中,与其他一些语言(C#等)相反,
抽象类没有语言级支持。 不可能强制在编译期间类是抽象的。一个类只是按照惯例抽象,并且由开发人员尊重该约定。
对于接口,单词" protocol"在目标C中使用它。对于同一事物,它只是一个不同的词。
在目标C中你可以
针对接口的代码 ..通过将某个对象声明为
id<protocolName>
通过声明它们符合您在类接口中执行的协议来向类添加其他功能
@interface ClassName <protocolName>
因此,甚至可能存在一个类是抽象类的子类,并且它也符合某些协议的情况。
答案 1 :(得分:2)
感谢Rob Napier在here发表的评论。我的回答是:
接口只是类的外部视图。它揭示了公开。
在Swift中,你只需在一个.Swift
文件中编写一个类,如果要求Xcode显示你可以generate its interface。 Xcode将仅,然后显示公共/内部的属性/功能。
在Objective-C中。您首先必须手动编写接口...声明该类是公共的,然后手动编写实现。没有实现的接口不可编译。就像你说这是我的课程的样子,但是你没有为如何实现公共方法或如何操纵你的属性提供任何东西 - 当你必须(提供)时。
摘要释放 如何实施
对于抽象类,您不应该提供任何实现,只是它将具有这样的参数,或者它将具有这样的签名的此类函数。但是,抽象类 可自行编译。因为您不需要提供任何其他内容。