継承の代わりに依頼する

10420 ワード

参考『再構築』
(1)元の例:
<?php

class Worker

{

    public function inhome()

    { echo "inhome!!!".'<br>'; }

    public function eat()

    { echo "eat!!!".'<br>'; }

    public function working()

    { echo "working!!!".'<br>'; }

    public function salary()

    { echo "get salary!!!".'<br>'; }

}    



class Student extends Worker

{

    public function gotoSchool()

    { echo "gotoSchool!!!".'<br>'; }

    public function learnKnowledge()

    { echo "learnKnowledge!!!".'<br>'; }

}



$jack = new Student();

$jack->eat();  //     Student     Worker  2   ,   eat() $jack->inhome();  //     Student     Worker  2   ,   inhome() $jack->gotoSchool();

$jack->learnKnowledge();

?>

(2)継承関係を依頼に変更
<?php

class Worker

{

    public function inhome()

    { echo "inhome!!!".'<br>'; }

    public function eat()

    { echo "eat!!!".'<br>'; }

    public function working()

    { echo "working!!!".'<br>'; }

    public function getoffWork()

    { echo "getoffWork!!!".'<br>'; }

    public function salary()

    { echo "get salary!!!".'<br>'; }

}    



class Student

{

    public function inhome($worker)  // Student    inhome()     

    { $worker->inhome(); }

    public function eat($worker)  // Student    eat()     

    { $worker->eat(); }

    public function gotoSchool()

    { echo "gotoSchool!!!".'<br>'; }

    public function learnKnowledge()

    { echo "learnKnowledge!!!".'<br>'; }

}

$work = new Worker();

$jack = new Student();

$jack->eat($work);

$jack->inhome($work);

$jack->gotoSchool();

$jack->learnKnowledge();

?>

この方法では、表示する必要がある2つのオブジェクトをインスタンス化し、そのうちの1つのオブジェクトをパラメータとして別のオブジェクトに渡すことが不適切です.(3)再構築継続
<?php

class Worker

{

    public function inhome()

    { echo "inhome!!!".'<br>'; }

    public function eat()

    { echo "eat!!!".'<br>'; }

    public function working()

    { echo "working!!!".'<br>'; }

    public function getoffWork()

    { echo "getoffWork!!!".'<br>'; }

    public function salary()

    { echo "get salary!!!".'<br>'; }

}    



class Student

{

    private $worker;

    public function __construct()

    { $this->worker = new Worker(); }

    public function inhome()  // Student    inhome()     

    { $this->worker->inhome(); }

    public function eat()  // Student    eat()     

    { $this->worker->eat(); }

    public function gotoSchool()

    { echo "gotoSchool!!!".'<br>'; }

    public function learnKnowledge()

    { echo "learnKnowledge!!!".'<br>'; }

}

$jack = new Student();

$jack->eat($work);

$jack->inhome($work);

$jack->gotoSchool();

$jack->learnKnowledge();

?>

ここでWorkerをStudentのフィールドに設定し、Studentで委任関数を設定します.このようにすると,表示されないワークオブジェクトをパラメータとしてStudentの委任関数に伝達するのに有利である.