05月29, 2016

abstract和interface有什么区别

语法区别

  1. 抽象类只能用extends关键词单继承,而接口可以用implements多继承。
  2. 抽象类可以有成员属性,接口不可以。
  3. 抽象类可以有具体的方法代码,而接口只能定义方法名不能有具体实现。

场景区别

  • 简单的说,抽象类是描述一个类是什么,而接口描述一个类能做什么。

  • 抽象类可以提供一个事物最基本的方法,而接口类似插件,提供一个事物的扩展功能。

举例说明

如果我们开发一个游戏,现在设计游戏角色类,根据经验,一般游戏角色都可以走,跑和跳的,但不是所有的角色都会游泳,那么我们可以这么设计类。

<?php

abstract class PlayerRole{

    /**
     * @return mixed
     */
    abstract function walk();

    /**
     * @return mixed
     */
    abstract function run();

    /**
     * @return mixed
     */
    abstract function jump();

}

interface Swim{

    /***
     * swim constructor.
     */
    public function swim();

}

class Kevin extends PlayerRole implements Swim{

    public function walk()
    {
        // TODO: Implement walk() method.
    }

    public function run()
    {
        // TODO: Implement run() method.
    }

    public function jump()
    {
        // TODO: Implement jump() method.
    }

    public function swim()
    {

    }

}

class Egg extends PlayerRole {

    public function walk()
    {
        // TODO: Implement walk() method.
    }

    public function run()
    {
        // TODO: Implement run() method.
    }

    public function jump()
    {
        // TODO: Implement jump() method.
    }
}

上面我们设计了两个角色,Kevin会游泳,但Egg不会,但他们作为游戏角色,是都具有走跑跳功能的。

本文链接:http://www.qiana.info/post/abstract_interface.html

-- EOF --

Comments