Image

跟PHP一起玩轉物件導向:從玩具箱到工具箱-進階概念

第三階段:進階概念

在上個階段,你可能有看到繼承的影子,在這個階段,我們會探討繼承、介面和抽象類別等更深入的概念。這些都是提高程式碼重用性、擴展性和維護性的重要工具。

繼承

繼承是 OOP 中的一個核心概念,它允許一個類別(子類別)繼承另一個類別(父類別)的屬性和方法。這意味著我們可以創建一個通用的父類別,然後通過繼承來擴展這個父類別,創建出專門的子類別。

PHP
<?php

namespace Rewrite\\ExerciseObjectOriented;

/**
 * 交通工具
 *
 * Class Vehicle
 * @package Rewrite\\ExerciseObjectOriented
 */
class Vehicle
{
    /** @var string 廠牌 */
    public string $brand;

    /**
     * @return void
     */
    public function startEngine(): void
    {
        echo "引擎啟動了";
    }
}
PHP
<?php

namespace Rewrite\\ExerciseObjectOriented;

/**
 * 汽車
 * Car 繼承 Vehicle
 *
 * Class Car
 * @package Rewrite\\ExerciseObjectOriented
 */
class Car extends Vehicle
{
    /**
     * 
     * @return void
     */
    public function openDoor(): void
    {
        echo "車門打開了";
    }
}

使用端

PHP
$car = new Car();
$car->brand = "Toyota";
$car->startEngine();  // 繼承自 Vehicle 類別
$car->openDoor();  // Car 類別自己的方法

在這個例子中,Car 類別繼承了 Vehicle 類別的 brand 屬性和 startEngine 方法。此外,Car 類別還定義了自己的 openDoor 方法。

子類別可以覆寫(Override)父類別的方法,提供自己的實現:

PHP
<?php

namespace Rewrite\\ExerciseObjectOriented;

/**
 * 電動車
 * ElectricCar 繼承 Vehicle
 *
 * Class ElectricCar
 * @package Rewrite\\ExerciseObjectOriented
 */
class ElectricCar extends Vehicle {

    /**
     * @return void
     */
    public function startEngine(): void
    {
        echo "啟動電動馬達";
    }
}

$electricCar = new ElectricCar();
$electricCar->startEngine();  // 輸出: 啟動電動馬達

介面(Interface)

介面定義了一組方法的協定,但不提供這些方法的具體實現。一個類別可以實現(Implement)一個或多個介面,並提供所有介面方法的實現。

PHP
/**
 * Drivable 介面
 *
 * Interface Drivable
 * @package Rewrite\\ExerciseObjectOriented
 */
interface Drivable
{
    /**
     * 啟動引擎
     *
     * @return void
     */
    public function startEngine(): void;

    /**
     * 停止引擎
     *
     * @return void
     */
    public function stopEngine(): void;
}

class Car implements Drivable {
    public function startEngine() {
        echo "車子引擎啟動了";
    }

    public function stopEngine() {
        echo "車子引擎關閉了";
    }
}

介面是一種強制約定,保證實現介面的類別提供介面中聲明的所有方法。

抽象類別(Abstract Class)

抽象類別是不能被實例化的類別,主要用於定義一個類別的基本結構,讓其他類別去繼承它並提供具體的實現。

PHP
<?php

namespace Rewrite\\ExerciseObjectOriented;

/**
 * 動物-抽象類別
 *
 * Class Animal
 * @package Rewrite\\ExerciseObjectOriented
 */
abstract class Animal {
    /** @var string 名稱 */
    public string $name;

    /**
     * @return void
     */
    public function eat() {
        echo "{$this->name} 正在吃東西";
    }

    /**
     * 
     * 使動物發出聲音
     * 抽象方法,子類別必須提供實現
     *
     * @return void
     */
    abstract public function makeSound();
}

class Dog extends Animal {
    public function makeSound() {
        echo "汪汪汪";
    }
}

class Cat extends Animal {
    public function makeSound() {
        echo "喵喵喵";
    }
}

$dog = new Dog();
$dog->name = "小黑";
$dog->eat();  // 輸出: 小黑 正在吃東西
$dog->makeSound();  // 輸出: 汪汪汪

$cat = new Cat();
$cat->name = "小花";
$cat->eat();  // 輸出: 小花 正在吃東西
$cat->makeSound();  // 輸出: 喵喵喵

抽象類別可以包含抽象方法和具體方法。抽象方法是沒有實現的方法,它定義了子類別必須實現的方法。

透過學習這些進階概念,將能夠更好地組織和設計相關的程式碼,使其更加靈活和可維護。