跳到主內容

開發物件導向概念

繼承、封裝、多型、抽象:物件導向四大支柱詳解(PHP & Java範例)

物件導向程式設計(OOP)是現代軟體開發的核心概念之一,而繼承、封裝、多型、抽象則是OOP的四大支柱。它們共同構成了OOP的基礎,讓程式碼更具可讀性、可維護性、可擴展性。以下將詳細說明這四個概念,並以PHP和Java兩種常見的OOP語言為例進行解說。

1. 封裝(Encapsulation)

  • 概念: 將資料(屬性)和操作資料的方法(方法)封裝在一個類別中,對外提供一個統一的介面。
  • 目的: 隱藏內部實現細節,保護資料的完整性,提高程式碼的可維護性。
  • PHP範例:

PHP

class Person {
    private $name;
    private $age;

    public function __construct($name, $age) {
        $this->name = $name;
        $this->age = $age;
    }

    public function getName() {
        return $this->name;
    }

    public function getAge() {
        return $this->age;
    }

}
  • Java範例:

Java

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
  • 說明:
    • name 和 age 屬性被聲明為私有(private),外部無法直接訪問。
    • 提供了 getName() 和 getAge() 方法來獲取屬性的值,控制了對屬性的訪問。

2. 繼承(Inheritance)

  • 概念: 建立類別之間的層次關係,子類別繼承父類別的屬性和方法,實現代碼的重用。
  • 目的: 減少重複代碼,建立類別之間的 is-a 關係。
  • PHP範例:

PHP

class Student extends Person {
    private $studentId;

    public function __construct($name, $age, $studentId) {
        parent::__construct($name, $age);
        $this->studentId = $studentId;
    }

}
  • Java範例:

Java

public class Student extends Person {
    private int studentId;
  
    public Student(String name, int age, int studentId) {
        super(name, age);
        this.studentId = studentId;
    }
}
  • 說明:
    • Student 類別繼承了 Person 類別,擁有 Person 類別的所有屬性和方法。
    • Student 類別還新增了自己的屬性 studentId。

3. 多型(Polymorphism)

  • 概念: 同一個方法在不同的子類別中有不同的實現,通過父類別的引用可以調用不同子類別的方法。
  • 目的: 增加程式碼的靈活性,實現動態綁定。
  • PHP範例:

PHP

class Shape {
    public function draw() {
        // ...
    }
}

class Circle extends Shape {
    public function draw() {
        // 畫圓
    }
}

class Rectangle extends Shape {
    public function draw() {
        // 畫矩形
    }
}
  • Java範例:

Java

class Shape {
    public void draw() {
        // ...
    }
}

class Circle extends Shape {
    public void draw() {
        // Draw a circle
    }
}

class Rectangle extends Shape {
    public void draw() {
        // Draw a rectangle
    }
}
  • 說明:
    • Shape 是父類別,Circle 和 Rectangle 是子類別。
    • 它們都重寫了 draw() 方法,實現了不同的繪圖功能。

4. 抽象(Abstraction)

  • 概念: 關注物件的本質特徵,忽略不相關的細節。抽象類別和介面是實現抽象的兩種方式。
  • 目的: 提高程式碼的可複用性,定義一組規範。
  • PHP範例:

PHP

abstract class Animal {
    abstract public function makeSound();
}
  • Java範例:

Java

abstract class Animal {
    public abstract void makeSound();
}
  • 說明:
    • Animal 是一個抽象類別,不能被實例化。
    • makeSound() 是一個抽象方法,子類別必須實現它。

總結

繼承、封裝、多型、抽象是物件導向程式設計的四大支柱,它們相互關聯,共同構成了OOP的基礎。通過合理地運用這些概念,可以設計出更加靈活、可維護、可擴展的軟體系統。

延伸學習

  • 介面(Interface): 是一種特殊的抽象類別,只包含抽象方法和常量。
  • 多重繼承: PHP允許多重繼承,而Java只允許單繼承,但可以使用介面來實現多重繼承的效果。
  • 抽象類別與介面的區別: 抽象類別可以包含具體方法,而介面只能包含抽象方法。