面向对象之抽象类和接口

问题

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

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

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

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;