• PHP 接口类和抽象类的区别


    <?php
    
    //定义接口类
    interface Iface {
        //interface 是完全抽象的,只能声明方法,而且只能声明 public 的方法,不能声明 private 及 protected 的方法,不能定义方法体,也不能声明实例变量 。
        //接口类定义属性只能是常量,但是不太符合接口类模板这个特性
        const PI = 3.1415926;
        //接口类的方法访问控制只能是public  并且只能声明,不能定义方法体
        public function foo();
        public function bar();
    }
    
    //定义抽象类
    abstract class Base {
        //定义抽象方法需要加上abstract关键字
        abstract public function foo();
        abstract public function bar();
    
        //抽象类可以定义方法
        public function test() {
            echo 'test';
        }
    }
    
    //抽象类继承要用extends关键字
    class Class1 extends Base {
        //子类的方法访问控制不能比抽象类更严格
        /*
         * 抽象类为public,子类的必须为public
         * 抽象类为protected,子类必须为public或protected
         * 抽象类为private,则报错
         * */
        public function foo() {
    
        }
    
        //抽象类中的abstract修饰的方法必须实现
        public function bar() {
    
        }
    }
    
    //如果子类未实现抽象类的所有抽象方法  则子类也是抽象类  必须加上abstract关键字
    abstract class Class2 extends Base {
        public function foo() {
    
        }
    }
    
    //接口继承要用implements关键字,并且可以继承多个接口
    class Class3 implements Iface {
        //子类必须完成接口类的所有方法 少一个都不行
        public function foo() {
    
        }
    
        public function bar() {
    
        }
    }
    
    /**
     *
     * 抽象类和接口的异同
    
    1. 相同点:
    (1)      两者都是抽象类,都不能实例化。
    (2)      interface 实现类及 abstractclass 的子类都必须要实现已经声明的抽象方法。
    2. 不同点:
    (1)      interface 需要实现,要用 implements ,而 abstractclass 需要继承,要用 extends 。
    (2)      一个类可以实现多个 interface ,但一个类只能继承一个 abstractclass 。
    (3)      interface 强调特定功能的实现,而 abstractclass 强调所属关系。
    (4)      尽管 interface 实现类及 abstractclass 的子类都必须要实现相应的抽象方法,但实现的形式不同。
     * interface 中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体 ) ,实现类必须要实现。而 abstractclass 的子类可以有选择地实现。这个选择有两点含义: a)abstract class 中并非所有的方法都是抽象的,只有那些冠有 abstract 的方法才是抽象的,子类必须实现。那些没有 abstract 的方法,在 abstractclass 中必须定义方法体; b) abstract class 的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。
    (5)      abstractclass 是 interface 与 class 的中介。 abstract class 在 interface 及 class 中起到了承上启下的作用。一方面, abstractclass 是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。
    (6)      接口中的抽象方法前不用也不能加 abstract 关键字,默认隐式就是抽象方法,也不能加 final 关键字来防止抽象方法的继承。而抽象类中抽象方法前则必须加上 abstract 表示显示声明为抽象方法。
    (7)      接口中的抽象方法默认是 public 的,也只能是 public 的,不能用 private , protected 修饰符修饰。而抽象类中的抽象方法则可以用 public ,protected 来修饰,但不能用 private 。
     *
     */
  • 相关阅读:
    vmware ubuntu 异常关机无法连接到网络
    Speed up GCC link
    常用的一些解压命令
    Log4j 漏洞复现
    Test Case Design method Boundary value analysis and Equivalence partitioning
    CCA (Citrix Certified Administrator) exam of “Implementing Citrix XenDesktop 4”
    What is Key Word driven Testing?
    SAP AGS面试小结
    腾讯2013终端实习生一面
    指针的引用
  • 原文地址:https://www.cnblogs.com/tudou1223/p/13685632.html
Copyright © 2020-2023  润新知