●接口声明了一组相关的方法,在所有类之外

  ●抽象类是一种不完整的类定义,其中有些方法虽已声明,但没有定义

  从概念上说,接口定义了独立于类层次结构的应用编程接口(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派生一个子类(也可能作为一个嵌套的类),只实现一个方法,而非两个方法.

posted on 2008-07-21 19:15  肖斌  阅读(362)  评论(0编辑  收藏  举报