之前对于"接口"概念很模糊,今天看了园子里两篇文章,有点开始懂了:
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 和 interface在C#2.0中都是用来进行抽象类定义的):
都不能被直接实例化,都可以通过继承实现其抽象方法;
都是面向抽象编程的技术基础,实现了诸多的设计模式;
(2)不同点:
在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法。而在interface中,只能够有静态的不能被修改的数据成员,接口中不允许提供任何成员的实现方式;
['这个不同点在设计类的时候应该注意']
当在差异较大的对象间寻求功能上的共性时,使用接口;当在共性较多的对象间寻求功能上的差异时,使用抽象基类
->正是这是这个原因导致了abstract class和interface所反映出的设计理念不同
->可以说: 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 ,但是其设计理念没有使用"接口"来得直接明了.