2011-04-29 122 views
16

抽象类具有具体和抽象的功能。 接口只有抽象函数。接口优于抽象类的优点是什么?

两者都可以覆盖。它是

其中一个的实时优势是什么?

+3

请选择*一种*语言。相应的答案*可能会非常不同。 – 2011-04-29 17:34:44

+1

@Oli - 所以我应该发布一个新的问题 - 不同的语言如java,php,.net的OOP如何:-) – zod 2011-04-29 18:15:27

+0

不,因为这个问题太广泛了。关于SO的问题需要*具体*。 – 2011-04-29 18:17:41

回答

32

接口适用于当你想说“我不在乎你是如何做到的,但是你需要完成的事情。”

当你想说“我知道你应该做什么,我知道你应该在一些/很多情况下应该如何做”时,抽象类就是用来表达的。

抽象类有一些严重的缺点。例如:

class House { 

} 

class Boat { 

} 

class HouseBoat extends /* Uh oh!! */ { 
    // don't get me started on Farmer's Insurance "Autoboathome" which is also a helicopter 
} 

您可以通过一个接口打通:

interface Liveable { 

} 

interface Floatable { 

} 

class HouseBoat implements Liveable, Floatable { 

} 

现在,抽象类也是非常有用的。例如,考虑AbstractCollection类。它为所有集合定义了常见方法的默认行为,如isEmpty()contains(Object)。如果你愿意,你可以重写这些行为,但是......是确定一个集合是否真的可能改变的行为?通常它会是size == 0

而且由于它不会经常变化,开发人员的时间是否真的值得每个......单一时间......对于“解决”类别中的每种方法都实施该方法?更何况当你需要对它进行更改时,如果你不得不在任何地方重新实现它,你将会有代码重复和错过错误。

+2

这对于中型/大型项目同意某些模块将支持的接口也很有帮助。你需要知道你可以从其他模块得到什么,而其他模块已经知道他们可以从模块中得到什么。 – user183037 2011-04-29 17:37:29

+0

同意。它适用于更轻松地更改实施。 – corsiKa 2011-04-29 17:39:04

+4

+1 lol at“//不要让我开始Farmer的保险”Autoboathome“,它也是一架直升机” – mellamokb 2011-04-29 18:02:40

15

接口很有用,因为Java没有多重继承(但您可以根据需要实现尽可能多的接口)。

当您需要基类的具体行为时,抽象类很有用。

1

一个类可以实现多个接口,而它可能只继承一个类(抽象或具体),因为Java不支持多重继承。

0

您不重写接口。你执行它。

编写一个接口让实现者可以实现接口以及除了继承基类以外的其他接口。

抽象类可以部分或完全实现。标记类抽象只会阻止您实例化该类型的对象。

1

在OOP(大多独立于具体语言)抽象类是行为和结构的类层次结构的重用机制,它本身并不完整。 接口是独立于具体实现而指定模块(例如类)上的需求的机制。 所有其他区别都是技术细节,重要的是不同的用法。

0

- 方法没有任何实现的抽象方法,当一个类包含一个或多个抽象方法,那么它必须被声明为抽象类

-Interface是完全抽象的,不能有构造函数,实例和静态块,它只包含两种类型的成员 1.公共抽象方法 2.公共静态最终变量

*两者都不能实例化,但可以创建引用。

*哪一个更适合取决于应用程序 - 接口很有用,因为Java类不会支持多继承,但接口可以。

- 当您需要基类的具体行为时,抽象类很有用。

0

界面优于抽象类的主要优点是克服钻石 问题的发生并实现多重继承。 在java中,没有使用类为钻石问题提供的解决方案。由于这个原因,多继承是使用java中的类来阻塞的。因此,为了实现多重继承,我们使用接口。

2

的事实是 -

  1. Java不支持多重继承
  2. 多个接口可以实现
  3. 一些方法在抽象类中可以实现

这些事实可以被用来倾向于有利于接口或抽象类的优势。

如果有一个类必须与其他类共享多个行为,则接口将获胜。 如果方法定义必须与其他类共享/覆盖,抽象类将获胜。现在

0
class Animal 
{ void move(){} } 

class Bird 
{ void move(){fly} } 

class Fish 
{ void move(){swim} } 

,如果类动物就像

Animal a; 

a= new Bird(); or a = new Fish() 

这里抽象类,抽象效果很好,但如果有喜欢的Animal a[100] 100个对象;

你不能写new Bird().movenew Fish().move 100倍

使用的界面和写a[i].move。它将区分为鸟或鱼,并且move()将被调用

其次它支持多继承,因为类A可以实现尽可能多的接口。