无论我们使用的开发语言是Java / .Net / PHP……,只要是面向对象的语言,都是支持抽象类(Abstract Class)和接口(Interface)的。
他们是面向对象思想层面的概念,而不属于某种程序设计语言。在Java/.NET/PHP中,我们用interface关键字来定义接口;在C++中,我们通过创建一个只包含纯虚方法的类来定义接口。虽然同样是接口的概念,在不同语言中,我们用了不同的实现方式。所以,只要理解了两者的本质,在任何面向对象的语言中,它们的概念都是相通的。
但是,两者在其自身特性及应用方法上存在着诸多的相似性。例如,他们都不能被实例化、都可以被继承(严格来说接口应该叫做被实现)。因此,在很多人心中抽象类与接口的界限十分模糊,对何时该使用抽象类、何时该使用接口没有一个比较明确的概念。
本文就用PHP中的抽象类和接口的区别来简单做一个比较,看能不能给有疑问的你提供一点点帮助。
一、区别:
1、抽象类是实体的抽象;接口是行为的抽象;(抽象类表示“是一个(IS-A)”关系的抽象,接口表示“能(CAN-DO)”关系的抽象。)
2、抽象类是类(Class),接口是集合(Set),两者从本质上就不是同一种东西;(抽象类的使用动机是在不允许实例化的限制下复用代码;接口的使用动机是实现对象间的低耦合和多态。)
3、接口是通过 implements 关键字继承来实现的;而抽象类是通过 extends 关键字继承来实现的;(PHP中,接口也可以通过关键字 extends 继承来实现)
4、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量;抽象类中可以声明各种类型成员变量,实现数据的封装(JAVA接口中的成员变量都要声明为public static final类型)。
5、接口没有构造函数,抽象类可以有构造函数;
6、接口中的方法默认都是public类型的;而抽象类中的方法可以使用private,protected,public来修饰,抽象方法必须用abstract声明;
7、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类;
二、相同:
1、都不能被实例化;
2、函数体内都不能写任何实现代码,连两个大括号都不能写;
三、如何选择:
1、如果要创建一个模型,这个模型将由一些紧密相关的对象采用,就可以使用抽象类。如果要创建将由一些不相关对象采用的功能,就使用接口;
2、如果必须从多个来源继承行为,就使用接口;
3、如果知道所有类都会共享一个公共的行为实现,就使用抽象类,并在其中实现该行为。
这种文章已经拉大街咯…
挺好的,受教了