在iOS开发人员面试中最常被问到的问题之一是-抽象类和接口之间的区别。
我不知道答案,我也不明白。当你声明方法时,接口是类的一部分。它可以对其他类(公共的、.h文件)开放,也可以在实现中隐藏。
抽象类是一个类,它只用于创建隐藏子类,它不应该有自己的init方法(如果我理解正确的话)。
那么,这个问题的答案到底是什么呢?这个问题是什么意思?
我确实花了时间寻找答案,但答案与Obj-C无关,所以我无法自己找出答案。
我希望有人能给出明确的答案,这个问题会对那些想通过面试的人有所帮助。
发布于 2015-02-26 03:28:31
解决这个问题的一个好方法是首先在一般的编程理论中考虑它,然后在更具体的Objective-C上下文中考虑它。
抽象类-是一个纯粹用于子类化的类,不能实例化它。抽象类声明了一些东西,也有它的实现。
为什么要有这样一个特殊的课程呢?它是模仿现实生活的!:)想象一个抽象的东西--一种动物。每种动物的有什么共同之处?它们都是alive (并且可以死亡)。他们需要吃。可以在太空中移动吗?这些特征是所有动物的共同特征和基本特征()。我从来没有听说过一种动物不需要食物,不能移动,而且永远活着。除此之外,在不同的动物之间有很多不是很基本的差异。
地球上没有动物,它是,纯粹是一个抽象的动物。这一组基本的行为和特征根本不足以成为一种具体的动物。有一个隐含的原则,那就是要成为一种具体的动物,除了那些基本的特征之外,你还必须有一些额外的特征。
现在,在编程中,我们需要能够以某种方式
界面表达了这些基本原理(interface declaration)
我们知道这些基本原理是什么(声明的公共接口),我们知道在实践中它们是如何具体表现出来的(这些声明的特征的实现)。我们希望它们被所有具体的实体所继承。所以我们在抽象类中这样做,因为它满足了我提到的这些条件。它包含所有的基础,有它们的实现,但不能自己实例化。
抽象类是对一组相关实体的抽象,它捕获了所有实体之间的根本共同点。告诉我们它是如何确保所有更具体的实体都将继承它的done..and。
接口-是一个更小的东西。让我们来个现实生活中的类比。人,机器人,动物,风(自然力)。有些人会唱。机器人嵌入了语音合成器模块,因此它可以。秋风吹过我的玻璃,“唱”了许多我可以告诉你的话。而丁卡(r.i.p)我的狗,实际上也是一个很好的歌手。
但实际上,这四个人之间的“唱歌”只有一个共同点--你可以在你的耳朵里听到令人愉悦的声音。这四个人的演唱是如何发生的,在现实中有很大的不同,。(实现)
另一个复杂的问题是,当然不是所有的人、狗、风或动物都会唱歌。他们中的一些可以。
那么我们如何在编程中反映这种情况呢?通过接口:)
你可以有一个名为"SingInterface"的接口,在我们的例子中,它声明了一个行为/特征/功能,它是sing。接口只是声明了一些东西,仅此而已。接口没有说明某些事情是如何完成的,没有具体的实现。它也没有说明谁可以做到这一点,接口中的特征实际上并不局限于一种类型或一个类。(参见http://www.nasa.gov/centers/goddard/universe/black_hole_sound.html)
接口是1到N个特征/功能列表,但不知道它们将如何具体实现,以及可以任意(对于谁不存在规则)归因于来自根本不同的不同集合(动物或机器人)的实体的特征/功能列表。
面向对象编程借鉴了现实生活中的许多概念。这就是为什么这些类比如此有效。
Objective C中的,与其他一些语言(C#等)相反,
对于抽象类,没有语言级别的支持。在编译过程中,不可能强制类是抽象的。类只有在约定的情况下才是抽象的,并且由开发人员遵守该约定。
至于接口,在objective C中使用了一个词“协议”,这只是一个不同的词来表示相同的东西。
在objective C中,您可以
对接口 ..by执行
通过声明类符合您在类接口中执行的协议,将附加功能添加到类id
@ ClassName 接口
因此,甚至可能存在这样的情况,即您的类是抽象类的子类,并且它也符合某些协议。
发布于 2017-01-24 02:03:29
感谢罗布·纳皮尔在here上的评论。我的答案是:
接口只是类的外部视图。它公开地揭示了什么。
在Swift中,你只需在一个.Swift文件中编写一个类,如果让Xcode来展示你可以使用generate its interface。Xcode将只显示,然后显示公共/内部的属性/函数。
在Objective-C中。首先,您必须手动,编写interface...declaring什么类是公共的,然后再手动编写实现。没有实现的接口是不可编译的。这就像您说这就是我的类将是什么样子,但是您没有为提供任何内容:它是如何实现公共方法的,或者您是如何操作您的属性的-当您必须(提供)时。
抽象使您不必了解它实现的方式
对于抽象类,您不应该提供任何实现,只是它将具有这样的参数或具有这样的签名的函数。但是,抽象类本身是可编译的。因为你不需要提供比这更多的东西。
https://stackoverflow.com/questions/28726170
复制相似问题