●接口声明了一组相关的方法,在所有类之外
●抽象类是一种不完整的类定义,其中有些方法虽已声明,但没有定义
从概念上说,接口定义了独立于类层次结构的应用编程接口(API).实际上,接口可以用于非OO的编程模型中,例如COM或CORBA这样的基于组件的模型.但是,您要将重点放在面向对象环境中的接口使用上,在这里它们也是很有用的.接口是终极封装,因为它们隐藏了实现这些方法的类的所有细节,只暴露出使用的接口.它们在只支持单继承(类只能从一个基类继承)的语言中尤其重要(实际上是必要的).如果一个类通过接口来展现它的成员函数,那么我们称它"实现"了这个接口.
和接口不一样,抽象类是一个类:它可以拥有数据成员,可以是其他类的子类.但是和具体类(非抽象类)不同,它的某些行为故意留给其子类来定义.因此抽象类不能够实例化,只有具体类才能创建实例.
接口几乎等价于没有任何数据成员和方法定义的抽象类.在C++中,这就是您定义接口的方法:声明一个没有数据成员,只有纯虚函数的类.像下面的例子这样:
Class StatusCallback
{
public:
virtual void updateStatus(int oState,int nState) = 0;
}
然后,类可以从它派生,从而"实现"这个接口:
Class MyClass:SomeOtherClass,StatusCallback
{
public:
void updateStatus(int oState,int nState)
{
if(nState > oState)
{
......//do stuff
}
}
}
在Java中,接口通过interface关键字来定义:
public interface StatusCallback
{
void updateStatus(int oState,int nState);
}
然后接口由一个类来实现:
public class MyClass implements StatusCallback
{
public void updateStatus(int oState,int nState)
{
......//do stuff
}
......//do stuff
}
在既支持接口又支持抽象类的语言中,您常会看到一种模式,即通过一个抽象类来提供一个接口的"缺省实现".例如,下面的接口:
public interface XMLReader
{
public XMLObject fromString(String str);
public XMLObject fromReader(Reader in);
}
可能有这样的缺省实现:
public abstract class XMLReaderImpl
{
public XMLObject fromString(String str)
{
fromString(new StringReader(str));
}
public abstract XMLObject fromReader(Reader in);
}
于是,需要实现XMLReader的程序员可以选择从XMLReaderImpl派生一个子类(也可能作为一个嵌套的类),只实现一个方法,而非两个方法.
浙公网安备 33010602011771号