有关interface和abstract class的选用

我工作中碰到这样的情况
当可以使用abstract class 与interface时,该用哪个呢
如下的例子:
每个子类都有sheet,但是如果我选用abstract class,并把sheet作为成员变量时,abstract class中的方法没有用到sheet,只有在子类中才用到.在这种情况下,该选用哪个呢? 请大家发表一下看法

import java.util.ArrayList;
public interface ExcelRead
{

/**
返回ArrayList,其中ArrayList中每个元素为HashMap.
@roseuid 3ED40ED40360
*/
public abstract ArrayList getRecords();

/**
@roseuid 3ED426540194
*/
abstract Object getRecord(int i);

}
import java.util.ArrayList;
import java.util.HashMap;
import jxl.*;
public class BudgetDetail implements ExcelRead
{
private Sheet sheet;
public BudgetDetail()
{
ExcelSheet excelSheet = new ExcelSheet("input.xls",1);
sheet = excelSheet.getSheet();
}

public ArrayList getRecords()
{
//用到sheet
}

public Object getRecord(int i)
{
//用到sheet
}

}

interface会阻止任何函数被定义出来,以及阻止产生任何对象

用接口或是抽象类的选择简单的说

一方面在于你有没有公用的代码可以提取到父层次。

一旦你用了抽象类你就不能再多重继承了。

如果你有公用代码可提取,而又不需要去多重继承,那就用抽象类好了。

新手拿不定主义的时候就用抽象类。

just as what cc said

抽象类你就不能再多重继承了

The functions in java interface is like virtual functions in C++. We can not implement the detail things in these functions.

It seems that, if there is a class A1 inherited from abstract class A, A has method1(detail implementation) , but A1 has not method1 implementation.

So a1 = new A1();
a1.method1() will actually call A.method1().

Since I became a student several years ago, I almost forgot my previous work thing, hope exchange idea. Thanks.

接口是“like a ”象一个什么东西、或是具备什么功能

抽象类是 “ is a ”是一个什么东西。

一个带锁的门,那么一定是 “somthing extends 门 impliment 锁 ”

决不能说 “带门的锁”

这两个概念不具有可比性.接口是一组行为的约定,抽象类应该是包含了部分默认实现,并且不可以被直接实例化的类,它仍然是具体有形的,当一个抽象类里面只包含了抽象方法的时候,它实际上就应该是一个接口..
能不能多继承只是java语言级别的限定,是实现上的问题..
建议再复习一下GOF里面的第1.6.3里面,关于类继承和类型(接口)继承的阐述..

抱歉,应该是1.6.4

这两个概念当然有可比性!

没有可比性的话大家在讨论什么?

"一旦你用了抽象类你就不能再多重继承了"
java不支持多重继承,与之对应的便是接口。
您这句话的意思是,继承了抽象类,就不能再implement接口了么?

我认为接口表现的是一种行为,比如Comparable.

接口表现的是一种规格,比如Serilizable,Comparable

接口的局限就是拓展接口比较困难,所以要小心的定义接口

我感觉上你的这种情况应该使用抽象类而不是接口

因为你的ExcelRead提供是基本的实现而不是一种规格

我用一个比较傻的办法,对于分析不清的类,如果这个类被当作参数传递了,那么就将此类设计为interface->AbstractClass->Class的模式

关于interface和abstract应在设计模式时选择!



关于抽象类和接口,我想还是看具体的要求,什么模式之类的东西
都是有了应用才出现的,需求才是第一位的。
它们之间的区别是:

1. 在抽象类中可以实现某些方法,而接口不行
2. 抽象类是用来extends的,而继承有一定的局限性,只能继承一个类
而接口就不同,可以同时实现多个接口

这两者也可以联合使用。看具体的要求了。如果有共同方法的那些类
它们的共同的方法的实现是一样的,那么可以考虑用抽象类,把方法
在抽象类中实现,如果还有一些方法定义相同而实现不同,那么可以
考虑定义一个接口,让抽象类来implements这个接口

然后各个子类只用继承抽象类即可。


呵呵,发了上一篇发现似乎最后几句话会引起歧义。
把它当成一个例子看比较合适。

抽象类和接口联合使用,这可能要看具体的情况了,
我说的那种情况,应该还有一些限制,比如说在使用
接口的时候,不希望使用抽象类中定义的那些方法,
这其实起到一种隔离的效果。

如果没有这个要求,就不用这么麻烦,直接用一个抽
象类就可以了,实现那些共同的方法,定义那些不同
实现的方法。

当然如果方法的实现不尽相同,那么可以考虑使用接口