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 。

 

转载于:https://www.cnblogs.com/lingshao/p/5580266.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值