在上個階段,你可能有看到繼承的影子,在這個階段,我們會探討繼承、介面和抽象類別等更深入的概念。這些都是提高程式碼重用性、擴展性和維護性的重要工具。
繼承是 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(); // 輸出: 啟動電動馬達
介面定義了一組方法的協定,但不提供這些方法的具體實現。一個類別可以實現(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 "車子引擎關閉了";
}
}
介面是一種強制約定,保證實現介面的類別提供介面中聲明的所有方法。
抽象類別是不能被實例化的類別,主要用於定義一個類別的基本結構,讓其他類別去繼承它並提供具體的實現。
<?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(); // 輸出: 喵喵喵
抽象類別可以包含抽象方法和具體方法。抽象方法是沒有實現的方法,它定義了子類別必須實現的方法。
透過學習這些進階概念,將能夠更好地組織和設計相關的程式碼,使其更加靈活和可維護。