面向对象之抽象类和接口
问题
很多类里面用很多方法你不断的在重复写。
- 我不是可以重写一个类每个公共类我个实例化一个这个公共类,调用相同的方法就可以了
- 抽象类做的工作也就是这个,不过他省去了你实例化的这个步骤
比如人必须吃饭,约会一般要吃饭、看电影,但不一定表白
1、抽象类不能实例化
2、抽象类存在的目的是为了让子类继承
3、抽象类的定义和普通类的定义一样,只不过前面加了一个关键字abstract
4、抽象类里面一般都有抽象方法
抽象方法是用来让自子类实现的,而且子类必须实现,不实现就报错
5、抽象方法只能public或者protected
6、抽象方法如果有参数
抽象方法如果有参数,参数有默认值,那么实现该方法的时候参数和默认值也都要有
7、抽象类可以继承抽象类,子类在实现的时候所有的抽象方法都得实现
abstract class shopWriter{ public function writer(); } class XmlWriter extends shopWriter{ public function writer(){ ...实现具体的xml方法 } } class jsonWriter extends shopWriter{ public function writer(){ ...实现具体的json方法 } }
二、接口
当有很多人一起开发一个项目时,可能都会去调用别人写的一些类,那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候php接口类就起到作用了
- interface 接口
- implement 实现
你女朋友的爸妈的愿望;有车有房有存款
- 接口中的方法都是抽象方法,所以abstract可以省略
- 接口中的方法必须public
- 接口中只能规定方法,不能写属性
- 一个类可以实现多个接口,中间用逗号
- 一个类可以先继承父类,然后再实现接口
- 接口可以继承接口,但是里面的方法都要实现
Interface IFather { //public $iVar1="iVar1"; 此处接口定义中不能包含成员变量 //public static $iVar2="iVar2"; 此处接口定义中不能包含静态变量 const iVar3="iVar3"; function iMeth1(); } Class ISon implements IFather { function iMeth1() { echo "iMeth1...<br>"; } } $is=new ISon(); echo IFather::iVar3;
接口和抽象类有什么区别
1、定义接口的关键字是interface ,抽象类的关键字是abstract
2、抽象类和接口都不能直接实例化。
3、接口中的方法都是抽象的,抽象类中可以有方法的实现(即非抽象方法)
4、接口和抽象类中都可以定义变量,但是接口中定义的必须是公共的、静态的、Final的,抽象类中的变量跟普通类中的没有区别。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、接口是对一系列行为的抽象,而抽象类是对事物的抽象
7、抽象类可以包含静态方法,但是接口中不可以!
8、接口中的方法必须是public的,抽象类中的方法可以使public 和 protected的
9、一个类可以实现多个接口(implement),但只能继承一个抽象类(extends),所以一般来说,可以使用接口实现的尽量使用接口实现。