本文主要讨论php中abstract类和接口的区别。下边所有讨论都针对php代码来说。
【讨论地址】
在实际代码开发中,很多人经常会觉得抽象类和接口很类似。抽象类和接口都没有实现具体的方法,抽象类被继承后,在子类中对方法进行了具体的实现,接口也是类似。那么二者有什么区别呢。
抽象类
概念
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。在编程语言中抽象类通常用abstract关键字来修饰
特征
- 类名用abstract 关键字修饰
- 抽象类是类的一种,需要被继承
- 必须包含至少一个抽象方法,抽象方法没有方法体
- 抽象类不能实例化
- 子类必须定义抽象类中的所有抽象方法
接口
概念
(自己总结)面向对象中的接口指的是一种特殊的数据结构,使用interface关键字修饰,他说明了类需要实现的所有方法,但并不实现它们
特征
- 用interface关键字修饰,
- 具体的类使用implements关键字和他建立联系
- 不能被实例化
- 所有的方法都没有具体实现,只是一种声明(宣称自己有哪些方法)
- 所有的方法必须是共有的public
对比
相同点
- 都是上层的抽象层,都是对一种类的抽象
- 都不能被实例化
- 都包含了不用实现的方法
- 抽象方法和接口方法的参数可以和子类方法参数不一致,子类的不一致参数需要有默认值;
区别
- 抽象类需要被继承,使用extends关键字,在子类中实现抽象方法;接口需要被类实现,使用implements关键字
- 抽象类中可以实现方法、声明方法;接口只做方法的声明
- 抽象类的方法可以是public和protected;接口的方法只能是public
- 一个类只能继承一个抽象类;但可以实现多个接口
- 抽象类中可以有静态方法,但是抽象方法不能是静态的;接口中不能有静态方法
- 抽象类中的成员变量可以是各种类型的;而接口中不能有变量(php);
- 接口中常量不能被重载。