淺談面向對象——多態

從字面來解釋,多態就是事物的多種表現形式;從面向對象角度來解釋的話,多態就是不一樣對象中同種行爲的不一樣實現方式。舉個例子:好比人吃飯,不一樣的人吃飯方式都是不一樣的,好比你多是委婉型的,小口小口慢慢地吃,我是大口大口豪放型的吃。這就是吃飯這個行爲的不一樣表現形式,統稱「多態」。php

編程中多態是很常見的,咱們在不一樣的抽象(類)中用相同的方法名來命名同種行爲,而後再實現不一樣的操做,這樣作的優勢是html

  • 易擴展;git

  • 調用方便;程序員

但不少人會搞不清楚多態的概念,就會形成不一樣行爲的操做也使用多態來實現。編程

  • 概念易混淆;this

  • 亂用多態來實現不一樣的行爲;code

下面咱們就用PHP代碼來實現多態,例子:程序員在敲代碼,球員在打球。htm

不用多態對象

<?php
class Coder 
{
    public function playCode()
    {
        print_r("程序員在敲代碼!<br/>");
    }
}

class Player
{
    public function playBall()
    {
        print_r("球員在打球!<br/>");
    }
}

$coder = new Coder();
$player = new Player();
$coder->playCode();
$player->playBall();

上面的代碼能夠看出兩種職業人在工做,這是相同的行爲,不一樣的內部操做,可以使用多態來實現:繼承

<?php
abstract class Professional
{
    abstract public function play();
}

class Coder extends Professional
{
    public function play()
    {
        print_r("程序員在敲代碼!<br/>");
    }
}

class Player extends Professional
{
    public function play()
    {
        print_r("球員在打球!<br/>");
    }
}

class Run
{
    private $profess;

    public function __construct($profess)
    {
        $this->profess = $profess;
    }

    public function play()
    {
        if ($this->profess instanceof Professional) {
            $this->profess->play();
        }
    }
}

$coder = new Run(new Coder);
$coder->play();
$player = new Run(new Player);
$player->play();

上面的代碼就是多態實現,是否是有點像策略模式;這樣的好處就是再有這樣的職業人添加進來只須要繼承職業人類就能夠實現相關的行爲,那什麼狀況不能使用多態呢?

不一樣行爲不可以使用多態

好比程序員在吃飯、球員在玩遊戲,這兩種行爲抽象不出來他們的相同點,不能勉強進行多態化

總結

不要爲了多態而多態

原文連接:淺談面向對象——多態

相關文章
相關標籤/搜索