2026年11月4日 星期三

目前有哪些程式語言支援物件導向程式設計?

PYTHON 程式實習・物件導向延伸閱讀

目前有哪些程式語言支援物件導向程式設計?

從 Python、Java、C++ 到 JavaScript、Go、Rust:比較不同語言如何組織資料與行為

學會 Python 的類別(Class)、繼承(Inheritance)、多型(Polymorphism)與封裝(Encapsulation)之後,學生可能會問:只有 Python 能寫物件導向程式嗎?換成 Java、C++ 或 JavaScript,還能使用相同的設計觀念嗎?

答案是:目前多數主流程式語言都支援某種形式的物件導向設計。不過,各語言的物件模型不完全相同,也不是每種語言都提供傳統的類別繼承。

本篇學習目標:認識常見 OOP 語言、比較類別式與原型式物件模型、理解「沒有類別繼承」不等於「不能做物件導向設計」,並透過智慧養殖池範例跨語言比較。

一、什麼是物件導向程式設計(OOP)?

物件導向程式設計(Object-Oriented Programming)是一種軟體設計方式,強調把相關的資料(狀態)與操作(行為)組織成物件,並透過明確的介面進行互動。

例如,一座智慧養殖池可以有名稱、溶氧濃度、水溫等資料,也可以提供顯示狀態、更新感測值、判斷是否警示等操作。

Pond 智慧養殖池資料(狀態)name、oxygen、temperature方法(行為)show()、check_status()感測器 / 使用者監控畫面 / 警示

圖一:將養殖池的資料與操作集中在物件內,是理解 OOP 的第一步。

二、常見支援物件導向的程式語言

程式語言OOP 主要方式常見應用
Python類別式,支援多重繼承AI、資料分析、IoT、網站
Java類別式,單一類別繼承、介面企業系統、Android
C++類別式,支援多重繼承系統、遊戲、嵌入式
C#類別式,單一類別繼承、介面.NET、Unity、企業系統
JavaScript原型式,提供 class 語法網頁、Node.js
TypeScriptJavaScript 物件模型+型別系統大型前後端應用
PHP類別式,介面與 Trait網站後端
Ruby類別式,Mixin網站與自動化
Swift類別、結構與協定iOS、macOS
Kotlin類別式,介面Android、後端
Dart類別式,MixinFlutter App
Scala物件導向與函數式混合JVM、大數據
GoStruct、方法、介面;無類別繼承雲端、網路服務
RustStruct、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
重要提醒:JavaScript 的 class 是建立在原型機制上的語法;Go 與 Rust 沒有傳統類別繼承,但可以透過介面、Trait 與組合達到許多相似的設計目標。Python 的單底線與雙底線也不是 Java 那種嚴格的 private 存取控制。

四、同一個智慧養殖池,換不同語言怎麼寫?

以下只展示「建立物件並顯示名稱」的最小範例,方便比較語法。各語言的執行環境與完整專案設定不同。

範例一:Python
class Pond:
    def __init__(self, name):
        self.name = name

    def show(self):
        print(self.name)

pond = Pond("水井一號池")
pond.show()
範例二:Java(完整可執行範例)
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();
    }
}
範例三:JavaScript
class Pond {
    constructor(name) {
        this.name = name;
    }

    show() {
        console.log(this.name);
    }
}

const pond = new Pond("水井一號池");
pond.show();
範例四:Go(Struct + Method)
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 為主要方式?

C

主要是程序式語言,沒有內建 class 與類別繼承,但可用 struct、函式與指標模擬部分 OOP 設計。

Haskell

主要是函數式語言,使用 Typeclass 等機制表達抽象與多型,不是傳統類別式 OOP。

SQL

主要用於資料查詢與操作,不是一般用途的物件導向程式語言。

也要避免把「不以 OOP 為主」理解成「比較落後」。不同語言與典範各有擅長的問題領域。

七、為什麼大學生適合先用 Python 學 OOP?

  1. 語法相對簡潔:能先專注於類別、物件、繼承與多型,而不是大量樣板程式碼。
  2. 容易連結生活情境:飲料店 POS、學生選課、智慧養殖池都能用同一套設計概念來分析。
  3. 方便延伸到實務:可以從 Pond、Sensor、Controller 出發,逐步加入 MQTT、Web API、資料庫與 AIoT。

當學生理解 Python 的 OOP 設計後,學習 Java、C++ 或 JavaScript 時,就可以比較「概念相同在哪裡、語法與限制不同在哪裡」。

八、AI 時代的三階段學習活動

第一階段:No-AI|先自己比較

不使用 AI,閱讀 Python 與 JavaScript 的 Pond 範例,圈出「屬性」、「建構流程」、「方法」與「建立物件」的位置,並說明兩者相似之處。

第二階段:AI Pair|請 AI 協助跨語言轉換

建議提示詞:「請把這段 Python Pond 類別改寫成 JavaScript 與 Java,保留相同功能,並逐行比較建構子、屬性、方法與物件建立方式。請提供可執行的完整範例。」

學生應實際執行、核對輸出,不應只因為 AI 產生了程式碼就認為轉換成功。

第三階段:Challenge AI|檢查設計是否合理

假設系統增加「智慧養殖池、魚菜共生池、溶氧感測器」三種物件,請學生先判斷哪些適合用繼承、哪些適合用組合,再請 AI 提出架構,最後比較其合理性。

思考問題:感測器是養殖池的一種(is-a),還是養殖池擁有的設備(has-a)?如果是後者,通常應優先考慮組合,而非硬套繼承。

九、課後練習

  1. 列出三種支援類別式 OOP 的語言,說明各自常見的應用。
  2. 為什麼 JavaScript 雖然有 class,仍常被稱為原型式語言?
  3. Go 沒有傳統類別繼承,為什麼仍可以實現多型?
  4. 把 Python 的 Pond 類別新增 oxygen 屬性與 check_status() 方法,再嘗試改寫為另一種語言。
  5. 請說明「物件導向是一種設計方法,而非某個語言的專利」的意思。

十、結語:真正重要的是跨語言的設計能力

物件導向不是 Python 的專利,也不等於每一個程式都必須使用 class。 學會辨識資料、行為、介面與物件間的關係,才有能力在不同程式語言之間選擇合適的設計方式。即使 AI 能快速翻譯程式碼,學生仍需要判斷轉換後的程式是否符合原語言的特性與實際需求。

延伸閱讀建議:下一篇可使用同一個智慧養殖池案例,深入比較 Python、Java 與 C++ 的類別、封裝、繼承及多型。

沒有留言:

張貼留言