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

时间:2015-02-25 17:53:07

标签: objective-c

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

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

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

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

我确实花时间寻找答案,但答案与Obj-C无关,所以我无法自己弄明白。

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

2 个答案:

答案 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中。您首先必须手动编写接口...声明该类是公共的,然后手动编写实现。没有实现的接口可编译。就像你说这是我的课程的样子,但是你没有为如何实现公共方法或如何操纵你的属性提供任何东西 - 当你必须(提供)时。

摘要释放 如何实施

对于抽象类,您不应该提供任何实现,只是它将具有这样的参数,或者它将具有这样的签名的此类函数。但是,抽象类 可自行编译。因为您不需要提供任何其他内容。