ArcEngine , VS.NET , SQLSERVER
淡泊明智,宁静致远~~~

之前对于"接口"概念很模糊,今天看了园子里两篇文章,有点开始懂了:

http://www.cnblogs.com/AndyFish/archive/2008/08/11/1265232.html     (转载)

http://www.cnblogs.com/anytao/archive/2007/04/12/must_net_02.html  (转载)

两位作者都归纳得很好:

(1)相同点(abstract class 和 interfaceC#2.0中都是用来进行抽象类定义的):

 

     都不能被直接实例化,都可以通过继承实现其抽象方法;

 

     都是面向抽象编程的技术基础,实现了诸多的设计模式;

 

(2)不同点:

 

     在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法。而在interface中,只能够有静态的不能被修改的数据成员,接口中不允许提供任何成员的实现方式;

     ['这个不同点在设计类的时候应该注意']

 

    当在差异较大的对象间寻求功能上的共性时,使用接口;当在共性较多的对象间寻求功能上的差异时,使用抽象基类

    ->正是这是这个原因导致了abstract classinterface所反映出的设计理念不同

      ->可以说: abstract class表示的是"is-a"关系,interface表示的是("can-do关系")(或者说是"like-a"关系);

    这个不同点明显体现了abstract class和interface的本质差别,以下着重讲述:

 

     看前一位作者举的例子,在写一个"报警门"的类时他运用的是:

     

     Code class Door
     { 
     abstract void open();

     abstract void close(); 
     } 

 

 

     Code class Car

     { 
     abstract void start();

     abstract void park(); 
     } 

 


     interface Alarm
     { 
     void alarm(); 
     } 

 


     class AlarmDoor :Door,Alarm

     {...}

     class AlarmCar :Car,Alarm

     {...}

 

     解释:AlarmDoor本质上是Door(is door),但可实现"报警"功能(can do alarm)

          AlarmCar 本质上是Car (is car), 但可实现"报警"功能(can do alarm)

 

     接口的作用也就体现在这里:无论"门"还是"车",和"报警"功能都存在较大差异,使用"接口"就使两者很好地结合在一起,虽然说在C++中通过类的继承也可以实现 Door->AlarmDoor 和 Car->AlarmCar ,但是其设计理念没有使用"接口"来得直接明了.

 

     

posted on 2008-08-11 19:55  peaceful_fish  阅读(387)  评论(0编辑  收藏  举报