物件導向中的繼承(inheritance)

甚麼是繼承(inheritance)?

子類別(subclass) 可以承接父類別(superclass)  public 或protected 成員(member) ,使之具有共通public 或protected 成員。物件導向的繼承可以讓使用者少寫很多重複的程式碼。

案例示範 :
class Animal        //父類別
{
    public $height;
    public $weight;
    public $color;

    function setHeight($animalHeight){
        $this->height = $animalHeight;
    }

    function setWeight($animalWeight){
        $this->weight = $animalWeight;
    }
    
    function setColor($animalColor){
        $this->color = $animalColor;
    }

    function getHeight(){
        return $this->height;
    }

    function getWeight(){
        return $this->weight;
    }

    function getColor(){
        return $this->color;
    }
}
class Cat extends Animal        //cat子類別繼承了 animal 內所有的屬性跟方法
{
    public $behavior;
    function setBehavior($catBehavior){
        $this->behavior = $catBehavior;
    }
    function getBehavior(){
        return $this->behavior;
    }
}
class Dog extends Animal
{
    public $favThing;
    function setFavThing($dogFavThing){
        $this->favThing = $dogFavThing;
    }
    function getFavThing(){
        return $this->favThing;
    }
}
$kitten = new Cat;
$kitten->setHeight(30);
$kitten->setWeight(7);
$kitten->setColor('orange');
$kitten->setBehavior('goof around');
$doggie = new Dog;
$doggie->setHeight(45);
$doggie->setWeight(10);
$doggie->setColor('golden');
$doggie->setFavThing('toy');

echo '小貓的身高:';
echo $kitten->getHeight();
echo "\n小貓的體重:";
echo $kitten->getWeight();
echo "\n小貓的顏色:";
echo $kitten->getColor();
echo "\n特殊行為:";
echo $kitten->getBehavior();

echo "\n\n小狗的身高:";
echo $doggie->getHeight();
echo "\n小狗的體重:";
echo $doggie->getWeight();
echo "\n小狗的顏色:";
echo $doggie->getColor();
echo "\n喜歡的東西:";
echo $doggie->getFavThing();

output :

小貓的身高:30
小貓的體重:7
小貓的顏色:orange
特殊行為:goof around

小狗的身高:45
小狗的體重:10
小狗的顏色:golden
喜歡的東西:toy

以上案例可以看到我們先在父類別定義了所有動物都需要被記錄的身高體重及顏色,跟只有子類別特定動物需要被記錄的行為,由於所有動物都需要被記錄身高體重顏色,所以這些屬性都應該先寫在父類別內就不需要一直重複寫一樣的程式碼。

甚麼是覆寫(override)?

如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆寫(override)。

案例示範 :

覆寫父類別內的 getWeight 方法讓此方法自動加上kg

class Dog extends Animal
{
    public $favThing;
    function setFavThing($dogFavThing){
        $this->favThing = $dogFavThing;
    }
    function getFavThing(){
        return $this->favThing;
    }
    function getWeight(){
        return $this->weight.'kg';            
    }
}

output :

小狗的身高:45
小狗的體重:10kg
小狗的顏色:golden
喜歡的東西:toy

小貓的身高:30
小貓的體重:7
小貓的顏色:orange
特殊行為:goof around