目前有哪些程式語言支援物件導向程式設計?
從 Python、Java、C++ 到 JavaScript、Go、Rust:比較不同語言如何組織資料與行為
學會 Python 的類別(Class)、繼承(Inheritance)、多型(Polymorphism)與封裝(Encapsulation)之後,學生可能會問:只有 Python 能寫物件導向程式嗎?換成 Java、C++ 或 JavaScript,還能使用相同的設計觀念嗎?
答案是:目前多數主流程式語言都支援某種形式的物件導向設計。不過,各語言的物件模型不完全相同,也不是每種語言都提供傳統的類別繼承。
一、什麼是物件導向程式設計(OOP)?
物件導向程式設計(Object-Oriented Programming)是一種軟體設計方式,強調把相關的資料(狀態)與操作(行為)組織成物件,並透過明確的介面進行互動。
例如,一座智慧養殖池可以有名稱、溶氧濃度、水溫等資料,也可以提供顯示狀態、更新感測值、判斷是否警示等操作。
圖一:將養殖池的資料與操作集中在物件內,是理解 OOP 的第一步。
二、常見支援物件導向的程式語言
| 程式語言 | OOP 主要方式 | 常見應用 |
|---|---|---|
| Python | 類別式,支援多重繼承 | AI、資料分析、IoT、網站 |
| Java | 類別式,單一類別繼承、介面 | 企業系統、Android |
| C++ | 類別式,支援多重繼承 | 系統、遊戲、嵌入式 |
| C# | 類別式,單一類別繼承、介面 | .NET、Unity、企業系統 |
| JavaScript | 原型式,提供 class 語法 | 網頁、Node.js |
| TypeScript | JavaScript 物件模型+型別系統 | 大型前後端應用 |
| PHP | 類別式,介面與 Trait | 網站後端 |
| Ruby | 類別式,Mixin | 網站與自動化 |
| Swift | 類別、結構與協定 | iOS、macOS |
| Kotlin | 類別式,介面 | Android、後端 |
| Dart | 類別式,Mixin | Flutter App |
| Scala | 物件導向與函數式混合 | JVM、大數據 |
| Go | Struct、方法、介面;無類別繼承 | 雲端、網路服務 |
| Rust | Struct、impl、Trait;無類別繼承 | 系統、嵌入式 |
| Visual Basic .NET | 類別式 | .NET 應用 |
其他具有物件導向能力的語言還包括 Smalltalk、Eiffel、Delphi(Object Pascal)、Objective-C 等。重點不在背誦語言名單,而是辨識每種語言使用什麼機制來組織資料、共用行為與實現多型。
三、所有語言都有 OOP 四大觀念嗎?
課堂上常用「封裝、繼承、多型、抽象」來整理 OOP;但這四項是設計概念,不代表每種語言都必須提供相同的語法。
| 語言 | 封裝 | 傳統類別繼承 | 多型 | 抽象機制 |
|---|---|---|---|---|
| Python | 慣例、property | 有 | 有 | ABC、Protocol 等 |
| Java | 存取修飾詞 | 有 | 有 | 抽象類別、介面 |
| C++ | 存取修飾詞 | 有 | 有 | 抽象類別等 |
| C# | 存取修飾詞、屬性 | 有 | 有 | 抽象類別、介面 |
| JavaScript | 私有欄位等 | 原型繼承 | 有 | 物件介面與慣例 |
| Go | 套件可見性 | 沒有 | 有 | 介面 |
| Rust | 模組可見性 | 沒有 | 有 | Trait |
class 是建立在原型機制上的語法;Go 與 Rust 沒有傳統類別繼承,但可以透過介面、Trait 與組合達到許多相似的設計目標。Python 的單底線與雙底線也不是 Java 那種嚴格的 private 存取控制。四、同一個智慧養殖池,換不同語言怎麼寫?
以下只展示「建立物件並顯示名稱」的最小範例,方便比較語法。各語言的執行環境與完整專案設定不同。
class Pond:
def __init__(self, name):
self.name = name
def show(self):
print(self.name)
pond = Pond("水井一號池")
pond.show()
class Pond {
String name;
Pond(String name) {
this.name = name;
}
void show() {
System.out.println(name);
}
}
public class Main {
public static void main(String[] args) {
Pond pond = new Pond("水井一號池");
pond.show();
}
}
class Pond {
constructor(name) {
this.name = name;
}
show() {
console.log(this.name);
}
}
const pond = new Pond("水井一號池");
pond.show();
package main
import "fmt"
type Pond struct {
Name string
}
func (p Pond) Show() {
fmt.Println(p.Name)
}
func main() {
pond := Pond{Name: "水井一號池"}
pond.Show()
}
這四個範例都會顯示:
水井一號池
雖然語法不同,但共同的設計思路是:讓資料與相關操作保持關聯。Python、Java 與 JavaScript 使用 class;Go 則使用 struct 搭配方法。
五、沒有類別繼承,也能做到多型嗎?
可以。以 Go 為例,若不同裝置都提供 Show() 方法,就能透過介面以一致方式操作:
package main
import "fmt"
type Displayable interface {
Show()
}
type Pond struct { Name string }
func (p Pond) Show() { fmt.Println("養殖池:", p.Name) }
type Sensor struct { Name string }
func (s Sensor) Show() { fmt.Println("感測器:", s.Name) }
func display(item Displayable) {
item.Show()
}
func main() {
display(Pond{Name: "水井一號池"})
display(Sensor{Name: "溶氧感測器"})
}
這段程式沒有使用類別繼承,但 display() 可以接受不同型別的物件,展現多型設計。這也提醒我們:學習 OOP 的核心是理解設計概念,而非只記住某種語法。
六、哪些語言不是以 OOP 為主要方式?
主要是程序式語言,沒有內建 class 與類別繼承,但可用 struct、函式與指標模擬部分 OOP 設計。
主要是函數式語言,使用 Typeclass 等機制表達抽象與多型,不是傳統類別式 OOP。
主要用於資料查詢與操作,不是一般用途的物件導向程式語言。
也要避免把「不以 OOP 為主」理解成「比較落後」。不同語言與典範各有擅長的問題領域。
七、為什麼大學生適合先用 Python 學 OOP?
- 語法相對簡潔:能先專注於類別、物件、繼承與多型,而不是大量樣板程式碼。
- 容易連結生活情境:飲料店 POS、學生選課、智慧養殖池都能用同一套設計概念來分析。
- 方便延伸到實務:可以從
Pond、Sensor、Controller出發,逐步加入 MQTT、Web API、資料庫與 AIoT。
當學生理解 Python 的 OOP 設計後,學習 Java、C++ 或 JavaScript 時,就可以比較「概念相同在哪裡、語法與限制不同在哪裡」。
八、AI 時代的三階段學習活動
第一階段:No-AI|先自己比較
不使用 AI,閱讀 Python 與 JavaScript 的 Pond 範例,圈出「屬性」、「建構流程」、「方法」與「建立物件」的位置,並說明兩者相似之處。
第二階段:AI Pair|請 AI 協助跨語言轉換
學生應實際執行、核對輸出,不應只因為 AI 產生了程式碼就認為轉換成功。
第三階段:Challenge AI|檢查設計是否合理
假設系統增加「智慧養殖池、魚菜共生池、溶氧感測器」三種物件,請學生先判斷哪些適合用繼承、哪些適合用組合,再請 AI 提出架構,最後比較其合理性。
思考問題:感測器是養殖池的一種(is-a),還是養殖池擁有的設備(has-a)?如果是後者,通常應優先考慮組合,而非硬套繼承。
九、課後練習
- 列出三種支援類別式 OOP 的語言,說明各自常見的應用。
- 為什麼 JavaScript 雖然有
class,仍常被稱為原型式語言? - Go 沒有傳統類別繼承,為什麼仍可以實現多型?
- 把 Python 的
Pond類別新增oxygen屬性與check_status()方法,再嘗試改寫為另一種語言。 - 請說明「物件導向是一種設計方法,而非某個語言的專利」的意思。
十、結語:真正重要的是跨語言的設計能力
物件導向不是 Python 的專利,也不等於每一個程式都必須使用 class。 學會辨識資料、行為、介面與物件間的關係,才有能力在不同程式語言之間選擇合適的設計方式。即使 AI 能快速翻譯程式碼,學生仍需要判斷轉換後的程式是否符合原語言的特性與實際需求。
延伸閱讀建議:下一篇可使用同一個智慧養殖池案例,深入比較 Python、Java 與 C++ 的類別、封裝、繼承及多型。
沒有留言:
張貼留言