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 。

     

  • 相关阅读:
    时间格式
    分页1
    vs2010 VS2008 VS2005 快捷键大全
    css 常用标签
    JS Array数组操作
    CSS属性
    jquery 选择器大全
    @fontface
    以前写过的ajax基础案例(王欢huanhuan)
    Jquery操作下拉框(DropDownList)的取值赋值实现代码(王欢)
  • 原文地址:https://www.cnblogs.com/lingshao/p/5580266.html
Copyright © 2011-2022 走看看