面向对象之抽象类和接口

问题

很多类里面用很多方法你不断的在重复写。

  • 我不是可以重写一个类每个公共类我个实例化一个这个公共类,调用相同的方法就可以了
  • 抽象类做的工作也就是这个,不过他省去了你实例化的这个步骤

比如人必须吃饭,约会一般要吃饭、看电影,但不一定表白

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),所以一般来说,可以使用接口实现的尽量使用接口实现。