抽象类与设计点的接口有何不同?

时间:2010-04-12 07:27:16

标签: oop

我在stackoverflow上看到了很多答案,但我没有找到与我匹配的答案。 除了所有这些差异之外,如果我们说抽象类抽象行为的实现,而接口抽象实现行为的类型,那么它是否有意义。

7 个答案:

答案 0 :(得分:4)

抽象类可以(并且通常会)提供一些实现。

接口无法提供任何实现。

答案 1 :(得分:2)

与设计观点的主要区别在于:

  • 您可以通过在基本抽象类中创建受保护的构造函数来声明实现类的构造函数的合约。
  • 您可以提供基类可用的方法的实现
  • 你可以围绕合同制作一个包装器(例如验证方法参数)
  • 您可以在创建非抽象方法时提供“调用方案”,该方法调用由派生类实现的类型的抽象方法。这对于在派生类中实现算法的抽象非常有用,而基类实现了所有处理逻辑 - 准备和验证数据,并允许实际的处理算法由派生类实现。

所以我会说你在语句中是正确的,“抽象类抽象行为的实现,而接口抽象实现行为的类型”

抽象类:提供了实现某些方法的要求(你覆盖抽象类的方法

界面:仅定义合同。表示实现接口的类具有接口的方法(您实现接口

例如:

  • 通过在现有类上实现接口,您只需声明将接口方法添加到类的合同中。该类可能已经实现了接口的所有方法,您无需更改现有类中的任何内容。

  • 通过将基类型更改为抽象类,您需要覆盖所有方法,即使类型上已存在与基类的抽象方法具有相同名称的方法。

    < / LI>

答案 2 :(得分:0)

不是真的没有,因为抽象类不需要实现任何行为。它可能应该,因为否则你可能会认为它的用处,但它不必须

答案 3 :(得分:0)

通常,抽象类实现某些行为,但保留一些未实现的特殊行为。

例如,您可能编写一个实现网络应用程序服务器的类,但不实现流程函数,而是将其留给继承的类来实现。

class MyServer(Networkserver):
    // process() is called whenever a client has sent a request
    function process(data):
        ...

通过使类抽象而无法实例化,专业化函数不必具有某种适当的“默认”行为。

答案 4 :(得分:0)

Interface =纯抽象类(没有实现的抽象类)

答案 5 :(得分:0)

纯粹从设计的角度来看,并且与语言无关,接口是您的类和客户之间的契约,承诺它的作用,而不是它是如何做的。这是“程序到界面”中隐含的用法。

由于C ++等语言没有接口,因此抽象类是表示接口的唯一方法。对于接口是第一类构造的语言,任何一种方式都是可以接受的,并且在选择中存在权衡。当然,语言之间在实现方面存在其他技术差异,但我不相信你问过这些。

an interview with Erich Gamma,其中讨论了一些差异。

要回答你的问题,我认为从理论的角度来看这是有道理的。从实际的角度来看,它可能取决于您编程的语言:)

答案 6 :(得分:0)

两者都具有根据语言设计的特定用途 - 抽象类被设计为基类并且无法实例化。当你需要定义一个合同(NO实现)时,每个实现类必须以自己的方式遵循,那么你必须使用interfaces.Also -

可以是继承的基类

抽象类 - 是接口 - 否

可以有效吗

抽象类 - 是接口-No