2010-04-12 75 views
0

我已经在stackoverflow上看到很多答案,但我没有找到与我的匹配的答案。 除了所有这些差异,如果我们说一个抽象类抽象行为的实现,而一个接口抽象实现行为的类型,是否有意义。抽象类与设计点的接口有什么不同?

回答

2

从设计的角度来看,主要区别是:

  • 你可以声明在实现类的构造函数合同,通过建立在抽象基类中的受保护的构造。
  • 您可以通过基类
  • 可以使合同周围的包装提供的可用方法的实现(例如验证方法参数)
  • 你可以提供一个“呼叫计划”当您创建调用非抽象方法类型的抽象方法,由派生类实现。这对实现派生类中的算法抽象很有用,而基类实现所有处理逻辑 - 准备和验证数据,并让实际处理算法由派生类实现。

所以,我要说你是在该语句正确“的抽象类抽象行为的实现,而一个接口抽象它实现了行为的类型”

抽象类:提供必须实施一些方法(你覆盖抽象类的方法

接口:只定义了一个合同。表明实现该接口具有的接口方法的类(你实现一个接口

例如:通过实现对现有类的接口

  • ,你只需要声明添加界面方法到班级的合同。该类可能已经实现了该接口的所有方法,并且不需要更改现有类中的任何内容。

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

+0

不仅仅是说抽象类可以有实现和接口不能,类可以有很多接口并且只能有一个抽象基类,我觉得不同层次(家庭)的对象可以实现相同的接口,但它们不能具有相同的抽象基类。这就是为什么我相信,“一个抽象类抽象行为的实现,而一个接口抽象实现行为的类型” – somaraj 2010-04-12 08:39:12

4

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

并且接口不能提供任何实现。

+0

+1。然而,在一些语言(C++)中,没有“接口”,因此不提供任何实现的抽象类更可能。 – ereOn 2010-04-12 07:35:27

+2

@ereOn - 当OP提到接口时,人们必须假定他使用的是具有它们的语言;) – Oded 2010-04-12 07:37:31

0

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

0

通常,抽象类实现了一些行为,但留下了一些专门的行为未实现。

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

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

通过使类抽象,因此无法被实例化,对于专业化函数不必有某些适当的“默认”行为。

0

接口=纯抽象类(没有实现抽象类)

0

单纯从设计的角度,并且是语言无关,接口在类和客户之间的合同,承诺它做什么,不是它是如何做到的。这是“编程接口”口头禅中暗示的用法。

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

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

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

+0

我一直在寻找一个答案,支持我的论点“不同层次(家庭)的对象可以实现相同的接口,但他们不能有相同的抽象基类“。所以我相信“抽象类抽象行为的实现,而接口抽象实现行为的类型” – somaraj 2010-04-12 08:41:29

0

两个有特定用途按语言设计 - 抽象类被设计为一个基类,不能被实例化。 wheras当u只是需要定义一个合同(没有实现),每个实现类必须thrie自己的方式跟随,则u必须使用interfaces.Also -

可以是一个基类继承

抽象类 - 是的接口 - 无

能有impelementation

抽象类 - 有接口-No