abstract 与 interface 的区别与用法

结论

  1. 抽象类需要继承,用extends,而接口需要实现,用implements;
  2. 一个类可以实现多个接口,但只能继承一个抽象类
  3. 接口中每个方法都只有声明而没有实现,其中的每个方法实现类必须要实现;而抽象类中只需要实现抽象方法,其它方法可以选择性的实现;
  4. 接口中只能声明public的方法,不能声明private和protected的方法,不能对方法进行实现,也不能声明实例变量;但是抽象类中可以

抽象类

1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类方法 function 关键字前加了 abstract 关键字)的类。
2 .抽象类不能被直接实例化。抽象类中只定义(或部分实现)子类需要的方法。子类可以通过继承抽象类并通过实现抽象类中的所有抽象方法,使抽象类具体化。
3 .如果子类需要实例化,前提是它实现了抽象类中的所有抽象方法。如果子类没有全部实现抽象类中的所有抽象方法,那么该子类也是一个抽象类,必须在 class 前面加上 abstract 关键字,并且不能被实例化。

用法

需要继承,用extends

使用场景

  1. 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用 abstractclass 定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
  2. 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。 abstract 的中介作用可以很好地满足这一点。
  3. 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特 定的功能 。

demo

abstract class BaseShop
{
  public function buy($gid)
  {
      echo('你购买了ID为 :'.$gid.'的商品');
  }
  public function sell($gid)
  {
      echo('你卖了ID为 :'.$gid.'的商品');
  }
  //  abstract 声明之后的方法,继承这个抽象类的子类一定要实现 
  abstract public function view($gid)
  {
      echo('你查看了ID为 :'.$gid.'的商品');
  }
}
class BallShop extends BaseShop
{
     var $itme_id = null;
     public function __construct()
     {
         $this->itme_id = 2314;
     }
     public function open()
     {
         $this->sell($this->itme_id);
     }
}

接口类

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

用法

  1. 接口需要实现,用implements
  2. 一个类可以同时继承一个父类和实现任意多个接口。 extends 子句应该在 implements 子句之前。 PHP 只支持继承自一个父类,因此 extends 关键字后只能跟一个类名
  3. 实现多个接口时用逗号隔开 (class D extends B implements iA,iB)
  4. 接口不可以实现另一个接口,但可以继承多个 (interface iC extends iA,iB{})

应用场合

  1. 类与类之间需要特定的接口进行协调,而不在乎其如何实现。
  2. 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
  3. 需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。
  4. 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。

demo

 interface Shop
 {
       public function buy($gid);
       public function sell($gid);
       public function view($gid);
 }
 
 class BaseShop implements Shop
 {
    public function buy($gid)
    {
      echo('你购买了ID为 :'.$gid.'的商品');
    }
    public function sell($gid)
    {
       echo('你卖了ID为 :'.$gid.'的商品');
    }
    public function view($gid)
    {
       echo('你查看了ID为 :'.$gid.'的商品');
    }
 }

差异比较

相同点

  1. 两者都是抽象类,都不能实例化
  2. interface 实现类及 abstractclass 的子类都必须要实现已经声明的抽象方法

不同点

  1. interface 需要实现,要用 implements ,而 abstractclass 需要继承,要用 extends
  2. 一个类可以实现多个 interface ,但一个类只能继承一个 abstractclass
  3. interface 强调特定功能的实现,而 abstractclass 强调所属关系。

参看链接

猜你喜欢

转载自www.cnblogs.com/issac-fan/p/12797546.html
今日推荐