更新於 2024/08/10閱讀時間約 7 分鐘

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

第三階段:進階概念

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


繼承

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

<?php

namespace Rewrite\\ExerciseObjectOriented;

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

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

namespace Rewrite\\ExerciseObjectOriented;

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

使用端

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

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

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

<?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)一個或多個介面,並提供所有介面方法的實現。

/**
* 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

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(); // 輸出: 喵喵喵

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

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

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.