zoukankan      html  css  js  c++  java
  • interface与抽象类

    抽象类:

      定义:在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类

      抽象类不能被实例化。

      抽象类被继承之后,子类必须完全实现父类的全部抽象方法才能实例化。如果子类没有全部实现父类中的所有抽象方法,那么该子类也是一个抽象类,必须在 class 前面加上 abstract 关键字,并且不能被实例化。

    <?php
    abstract  class A{
        abstract function show();
    }
    class B extends A {
        public function index(){
            echo 111;
        }
    }
    

     B继承A,但是没有实例化其中的抽象方法show。所以结果会报错。

    其实在编辑器中就已经报错提示。

    同时,访问该文件时也会报错:

    Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::show)
    

      在B中实例化show方法:

    <?php
    abstract  class A{
        abstract protected function show();
    }
    class B extends A {
        public function show(){
            echo '实现抽象方法';
        }
        public function index(){
            echo 111;
        }
    }
    

      这样运行出来的结果就正常。

      注意:实例化抽象方法的访问权限不能超过父类定义方法的访问权限。

             即:A.show访问权限为public,则实例化的时候权限只能设置为:public。

                  A.show访问权限为protected,则实例化的时候权限可以设置为:public、protected。

                  A.show访问权限为:private  这种会直接报错,不能讲父类的抽象方法设置为私有。

          当将A.show访问权限设置为private:

    Abstract function A::show() cannot be declared private

    interface:

      接口是更高级的抽象类。

          interface 是完全抽象的,只能声明方法,而且只能声明 public 的方法,不能声明 private 及 protected 的方法,不能定义方法体,也不能声明实例变量 。

          任何实现接口的类都要实现接口中所定义的所有方法。

          使用 implements 关键字来实现某个接口。

      一个类可以同时继承一个父类和实现任意多个接口。 extends 子句应该在 implements 子句之前

      接口不能实现接口,但可以继承多个接口。

    <?php
    interface  A{
         function show();
    }
    class B implements A {
        public function index(){
            echo 111;
        }
    }
    

      如果不实现接口中的方法:就会出错

    Class B contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (A::show)
    

     

    抽象类与interface的异同:

    1.共同点: 

       都是抽象类,不能实例化。

       子类必须实现已经定义的抽象方法。

    2.不同点:

     抽象类需要继承,用extends; interface需要实现,用implements。

     一个类至多继承一个抽象类;但可以实现多个interface。

     接口中的抽象方法前不用也不能加 abstract 关键字,默认隐式就是抽象方法,也不能加 final 关键字来防止抽象方法的继承。而抽象类中抽象方法前则必须加上 abstract 表示显示声明为抽象方法。

      接口中的抽象方法默认是 public 的,也只能是 public 的,不能用 private , protected 修饰符修饰。而抽象类中的抽象方法则可以用 public ,protected 来修饰,但不能用 private 。

     

  • 相关阅读:
    164 Maximum Gap 最大间距
    162 Find Peak Element 寻找峰值
    160 Intersection of Two Linked Lists 相交链表
    155 Min Stack 最小栈
    154 Find Minimum in Rotated Sorted Array II
    153 Find Minimum in Rotated Sorted Array 旋转数组的最小值
    152 Maximum Product Subarray 乘积最大子序列
    151 Reverse Words in a String 翻转字符串里的单词
    bzoj3994: [SDOI2015]约数个数和
    bzoj 4590: [Shoi2015]自动刷题机
  • 原文地址:https://www.cnblogs.com/lingshao/p/5580266.html
Copyright © 2011-2022 走看看