接口与抽象类

2019-04-12  |  技术  |  586 views

       接口是规范,类是实现。

抽象类

       定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的(抽象类可以没有抽象方法,但抽象类依然不能被实例化)。被定义为抽象的方法只是声明了其调用方式(参数),不能实现其具体的功能。

abstract class Abstractclass{

    //抽象方法
    abstract protected getValue();

    //普通方法
    public function printOut(){
        echo "bilingbiling";
    }
}

       继承一个抽象类的时候,非抽象子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中的一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,子类中的实现方法就应声明为受保护或者公有。此外,方法的调用方式也必须匹配,即类型和所需参数数量一致。

       抽象类可以有成员属性,抽象方法不能被定义为私有。

       抽象类可以实现接口,且可以不实现其中的方法。

       抽象类可以继承抽象类,但不能重写抽象父类的抽象方法,这样的方法可以理解为抽象类的扩展。

abstract class Human{
    abstract function eat();
}

abstract class Student extends Human{
    abstract funciton study();
}

接口

       使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

       接口通过关键字 interface 定义,就像定义一个标准类一样,但其中定义所有的方法都是空的。接口类中定义的方法都必须是公有的。

       常量:接口中可以定义常量,但不能被子类或者子接口覆盖。

interface Play{
    const a = 100;
    public function toy();
}

       接口实现:要实现一个接口,使用 implements 操作符,非抽象类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。类要实现接口,必须使用和接口中所定义的方法完全一致的方式。

       类可以同时继承抽象类和实现接口,extends 要写在前面。

       抽象类实现接口,不需要重写其中的方法。

       实现多个接口时,接口中的方法不能有重名。

interface Play{
    const a = 100;
    public function toy();
}

interface Read{
    public function readBook();
}

abstract class Human{
    abstract function eat();
}

abstract class Student extend Human implements Play, Read{
    abstract function study();
}

       接口也可以继承一个或多个接口,使用 extends 关键字,多个接口用逗号隔开,但不能实现另一个接口,不能继承抽象类。

interface Play{
    public function playGame();
}

interface PlayNew{
    public function playNew();
}

interface Plays extends Play, PlayNew{
    public function playCytus();
}

总结

       抽象类一般用来定义一类实体是什么,包含的属性,抽象方法和非抽象方法。接口用来定义一类实体能做什么。

发表新评论