2026年11月4日 星期三

Python、Java、C++ 物件導向比較:智慧養殖池實作

Python 程式實習 · OOP 跨語言實戰

為什麼 Python、Java、C++ 都支援物件導向?

從同一個智慧養殖池範例,比較三種程式語言的 OOP 設計

當生成式 AI 能在幾秒鐘內將 Python 程式轉換成 Java 或 C++,大學生還需要學習物件導向嗎?答案是需要。因為真正值得學習的,不是記住三種語言的語法,而是理解資料如何組織、功能如何分工、系統如何擴充。

一、從智慧養殖池提出共同需求

假設要管理兩座養殖池:一般池與智慧池。每座池子有名稱與溶氧值,能回報狀態;智慧池另外在溶氧低於示範門檻時加上警示文字。三種語言都使用同一套需求,才方便比較。

教學提醒:本文的 5 mg/L 僅用於示範條件判斷,不是所有魚種或養殖環境通用的操作標準;真實監控須依物種、場域及感測器規格設定。

二、先理解共同的 OOP 架構

我們設計基底類別 Pond,再設計繼承它的 SmartPond。兩者都能呼叫 status(),但智慧池會覆寫這個方法。

Pondstatus()SmartPond覆寫 status()同一個 pond.status() 呼叫 → 依實際物件執行不同版本

這個架構展現三個核心觀念:類別組織資料與行為、繼承重用共同設計、多型讓相同呼叫依物件類型產生不同結果。封裝與抽象則進一步幫助我們管理資料規則和公開介面。

三、Python:用簡潔語法表達設計

Python 使用 class 宣告類別,__init__ 初始化資料,super() 呼叫父類別方法。方法覆寫不需要特別宣告關鍵字。

class Pond:
    def __init__(self, name, oxygen):
        self.name = name
        self.oxygen = oxygen

    def status(self):
        return f"{self.name}:溶氧 {self.oxygen:.1f} mg/L"

class SmartPond(Pond):
    def status(self):
        base = super().status()
        return base + ("(示範警示)" if self.oxygen < 5 else "(正常)")

ponds = [Pond("一般池", 6.2), SmartPond("智慧池", 4.3)]
for pond in ponds:
    print(pond.status())

四、Java:用明確的型別與繼承表達設計

Java 使用 extends 繼承,@Override 清楚標示覆寫方法。範例存成 Main.java,可使用 javac Main.java 編譯,再以 java Main 執行。

class Pond {
    protected String name;
    protected double oxygen;

    Pond(String name, double oxygen) {
        this.name = name;
        this.oxygen = oxygen;
    }

    String status() {
        return String.format("%s:溶氧 %.1f mg/L", name, oxygen);
    }
}

class SmartPond extends Pond {
    SmartPond(String name, double oxygen) {
        super(name, oxygen);
    }

    @Override
    String status() {
        return super.status() +
            (oxygen < 5 ? "(示範警示)" : "(正常)");
    }
}

public class Main {
    public static void main(String[] args) {
        Pond[] ponds = {
            new Pond("一般池", 6.2),
            new SmartPond("智慧池", 4.3)
        };
        for (Pond pond : ponds) {
            System.out.println(pond.status());
        }
    }
}

五、C++:以 virtual 支援執行階段多型

C++ 透過 public Pond 繼承,並用 virtual 與 override 實現執行階段多型。範例使用 unique_ptr 管理物件生命週期,避免手動 delete。需使用 C++14 或更新版本,例如 g++ -std=c++14 main.cpp -o main。

#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <sstream>
#include <iomanip>
using namespace std;

class Pond {
protected:
    string name;
    double oxygen;
public:
    Pond(string name, double oxygen)
        : name(name), oxygen(oxygen) {}
    virtual ~Pond() = default;

    virtual string status() const {
        ostringstream out;
        out << name << ":溶氧 " << fixed << setprecision(1)
            << oxygen << " mg/L";
        return out.str();
    }
};

class SmartPond : public Pond {
public:
    using Pond::Pond;
    string status() const override {
        return Pond::status() +
            (oxygen < 5 ? "(示範警示)" : "(正常)");
    }
};

int main() {
    vector<unique_ptr<Pond>> ponds;
    ponds.push_back(make_unique<Pond>("一般池", 6.2));
    ponds.push_back(make_unique<SmartPond>("智慧池", 4.3));
    for (const auto& pond : ponds) {
        cout << pond->status() << '\n';
    }
}

六、三種語言執行結果

上述三個程式的輸出概念相同:

一般池:溶氧 6.2 mg/L
智慧池:溶氧 4.3 mg/L(示範警示)

即使語法差異很大,背後的設計仍然一致:先定義共同介面,再允許不同物件提供自己的實作。

七、重要語法比較

概念PythonJavaC++
定義類別class Pond:class Pond { }class Pond { };
建構與初始化__init__建構子 Pond(...)建構子及初始化列表
繼承SmartPond(Pond)extends Pond: public Pond
呼叫父類別super()superPond::
覆寫方法同名方法@Overridevirtual / override
多型容器物件串列Pond[]vector<unique_ptr<Pond>>
記憶體管理自動管理為主垃圾回收為主RAII/智慧指標

八、封裝與抽象:三種語言有何不同?

本文範例主要聚焦類別、繼承與多型。若要強化封裝,可進一步限制溶氧資料的修改方式。Python 常用底線慣例與 @property;Java 可用 private 搭配方法;C++ 可用 private 或 protected 搭配成員函式。三種語言也都能透過公開方法或抽象介面,讓使用者不必了解內部實作細節。

重要觀念:Python 的 _oxygen 是命名慣例,不等同於 Java 或 C++ 的語言層級 private 存取限制。

九、AI 時代為什麼仍要學跨語言 OOP?

AI 可以快速翻譯語法,但不能代替學生確認設計是否符合需求。例如:智慧池真的應該繼承一般池嗎?溶氧值由誰負責驗證?如果加入魚菜共生池,現有的監控迴圈需不需要修改?這些都是架構設計問題,而非單純的語法轉換。

十、No-AI → AI Pair → Challenge AI 課堂實習

階段一|No-AI:觀察與比較

  1. 找出三種語言的類別、建構子、繼承與覆寫位置。
  2. 預測兩座池子的輸出,並說明多型如何發生。
  3. 將智慧池的溶氧改成 5.8,觀察結果。

階段二|AI Pair:合作轉換與檢查

請 AI 將 Python 版本改寫成 Java 或 C++,但要求保留原有類別架構。學生需逐項檢查建構子、覆寫、輸出及 C++ 記憶體管理,而不是只確認程式可以執行。

階段三|Challenge AI:新增魚菜共生池

新增 AquaponicsPond,除了溶氧還有水位;要求沿用同一個 status() 介面。學生先畫類別圖,再請 AI 協助撰寫三種語言版本,最後設計測試案例驗證。

十一、課後反思

  1. 如果未來改用 C# 或 Kotlin,哪些 OOP 觀念仍然適用?
  2. 為什麼 C++ 需要注意 virtual 與物件生命週期?
  3. 如果養殖池監控加入 MQTT 感測器,感測器應該繼承 Pond,還是讓 Pond 持有感測器物件?為什麼?

十二、結語:語法會改變,設計能力可以帶著走

Python、Java、C++ 的寫法不同,但它們都能用類別與物件組織系統,也能透過繼承與多型降低重複設計。當 AI 能替我們轉換程式語言時,理解問題、規劃責任、選擇合適的物件關係,以及驗證程式行為,才是大學生應該建立的核心能力。

教學定位:Python 程式實習/物件導向整合與跨語言比較。本文程式為可獨立執行的示範版本,未連接真實感測器。

沒有留言:

張貼留言