跳到主內容

物件導向

繼承、封裝、多型、抽象:物件導向四大支柱詳解(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只允許單繼承,但可以使用介面來實現多重繼承的效果。
  • 抽象類別與介面的區別: 抽象類別可以包含具體方法,而介面只能包含抽象方法。

希望這份詳盡的解答能幫助您更好地理解OOP的四大概念。如果您還有其他問題,歡迎隨時提出。