2010-01-19 124 views
13

任何人都可以告诉我完全抽象类和接口之间的区别究竟是什么?纯抽象类和接口

抽象类也可以将其所有方法都作为抽象。一个接口的所有方法都是抽象的。这种情况下两者之间的主要区别是什么?

如果纯粹的抽象类和接口有区别吗?接口的用途是什么?在使用接口的地方,我们可以使用纯粹的抽象类?

回答

14

要完成以前的答案:

接口是“合同”。如果一个类实现了一个接口,它必须提出接口中列出的所有服务。

抽象类是一个骨架。它定义了扩展类可以工作的某种方式,同时让它们有一些自由空间(抽象方法)是唯一的。

一个纯粹的抽象类做同样的事情作为一个接口,但具有独特的延伸的话,对我的问题,有没有兴趣

+1

纯抽象类具有独特扩展的问题,但可以定义其他可访问性而不是公共。 – csblo 2018-03-07 09:50:17

2

抽象类可以提供实现,即(公共,受保护,私有)方法主体。一个接口可以声明公共方法签名。这些方法必须通过实现接口的类来实现(以方法体的形式)。

5

在Java和C#,则可以使用多个接口,从派生并只有一个类继承,

+1

这就是答案 – 2010-01-19 07:57:08

+1

这不是答案,因为没有提到一个非常重要的方面:抽象类*可以实现成员。 – 2010-01-19 08:28:46

+1

@Wim:true,但是如果您阅读原始问题的第二段,则很明显OP仅对那些没有实现任何方法的抽象类感兴趣,因此看起来几乎与接口类似。 – catwalk 2010-01-19 08:35:11

10

每个接口隐含摘要:接口的身体的每一个方法声明是隐式的抽象和公众。

抽象类具有可包含实现的方法。抽象方法可以是公共,受保护或默认访问(包可见)。与接口不同,抽象类可以包含非静态和最终的字段。

另见:
Interfaces vs Abstract classesJava tutorial

0

一个类可以实现多个接口,但只从一个类(抽象或其他方式)延伸。如果你需要指定一个接口,那么你应该使用一个接口,以便类可以实现多个接口。

2

有三点不同:

  1. 接口只能声明公用方法(即无保护或包私有可见的方法),并不能宣布任何领域
  2. 子类只能扩展至多一个抽象类,但可以实现任意数量的接口
  3. 抽象类可以也有一些或全部的方法的实现
+0

而抽象类*可以实现方法。 – 2010-01-19 08:26:36

1

您可以使用Interface进行多重继承,但不能将抽象类用于多重继承。

Interface中的所有方法默认为public,在抽象类中,只有您设置为抽象的方法需要声明为public。

1

我只是要解决一个点(主要是因为其他问题已经被解决):

“哪里接口正在使用我们可以 使用纯粹的抽象类?”

从理论上讲,你可以。但是,在某种程度上你会失去灵活性和松耦合。它更优选代码接口和通过周围的那些,特别是在控制(IOC)情景反演从视图的集成点,因为这允许更大的可扩展性。

2

由于问题是关于纯粹的抽象类,那么我会说,答案将与继承和范围有关。这是我多次想到自己的事情,而这正是我想到的。

很明显,与多重继承有关的功能以前已经回答过了,所以我不会介入其中。范围虽然很大。

接口,因为他们都是public你不能定义成员的访问修饰符,......你所定义的公共接口,它的最终实施。这里有一个重要的区别,因为有你可以在纯抽象类定义了一个受保护的抽象成员。

从这样的类定义继承将迫使继承私下实现抽象构件,但范围它给消费者之类的(尽管它必须被定义为protected所以除非类被标记为sealed进一步继承本来访问)。

在本质上,你可以使用纯抽象类定义了一个专用接口。这是否是一个好主意是一个完全不同的问题,但我曾经见过的一个很好的用法是强化设计模式并使课堂设计标准化。

HTH

+2

Java中没有'sealed'关键字;该子类必须标记为“final”。 – 2011-04-28 19:24:18

3

它不是一个很theorotical交代,但是,编程是正确的

        Interface     Abstract Class 
Extend Class       No       Yes 
Extend Abstract Class     No       Yes 
Implement Interface      Yes(Extend Interface)  Yes 
Variables        Public Static Final   Public/Protected/Private/static/final/transient/volatile 
Contain Non-Public Method    No       Public/Protected/*Private 
Contain Abstract Method     Yes       Yes 
Contain No-Body, Non-Abstract Method Yes       No 
Contain Defined Method     No       Yes 
Contain Main Method      No       Yes 

*抽象类可以有私有方法,而不是抽象的私有方法。

3

选择纯粹抽象接口的一个原因是迫使子类实现由超类实现的特定方法。

例如(在Java中),

你说你想要的所有扩展类实现的toString(),equals()方法,和hashCode()。

您可以为该合同创建一个名为ForceSomeMethods的接口,但这些方法由Object隐式实现。

使ForceSomeMethods成为抽象方法的纯粹抽象类,并且将所有子类强制为实现这些方法。

+0

这是一个非常有趣的答案,也是我在别处没见过的答案。不是全部的答案,而是一个非常有价值的细节。 – 2013-08-20 19:41:44