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