阿摩線上測驗 登入

申論題資訊

試卷:111年 - 111 高等考試_三級_資訊處理:程式設計#109802
科目:程式設計
年份:111年
排序:0

申論題內容

四、抽象(abstract)類別、介面(interface) 、覆寫(override)方法、多載(overload) 方法是物件導向程式設計實現多型(polymorphism)的方式。下圖是人 事系統中人員基本資料維護的類別圖,請說明類別圖中的覆寫方法及多 載方法名稱(須說明理由) ,並使用 C++, Java 或 Python 程式語言撰寫 Person 類別與 Police 類別的程式碼。Police 類別之 GetPersonalInformation 函數必須傳回身分證(id_no) 、姓名(name) 、職稱(rank) ,UpdateRoleTitle 函數必須完整實作更新 police_rank。62ddee6fcce03.jpg

詳解 (共 1 筆)

詳解 提供者:hchungw
在這個類別圖中,Person 是一個抽象類別,因為它有抽象方法(在UML中以斜體表示):GetPersonalInformation 和 UpdateRoleTitle。這意味著它們在 Person 類別中不具備具體的實現,必須由繼承 Person 類別的子類別來實現,這就是方法的覆寫。
Police 和 Staff 是 Person 類別的具體子類別。它們必須實現(覆寫)Person 類別的抽象方法,提供這些方法的具體實現。
多載(Overloading)是指在同一範圍中有多個具有相同名稱但參數不同的方法。在這個類別圖中沒有明確表示有多載方法,因為多載通常會在同一類別中以不同的參數數量或類型來呈現。
以下是 Person 類別和 Police 類別的C++實現:
cpp
Copy code
#include <iostream>
#include <string>
// 抽象基類別 Person
class Person {
protected:
    std::string id_no;
    std::string name;
public:
    Person(const std::string& id, const std::string& name) : id_no(id), name(name) {}
    virtual ~Person() {}
    virtual std::string GetPersonalInformation() = 0; // 抽象方法
    virtual void UpdateRoleTitle(const std::string& newTitle) = 0; // 抽象方法
};
// Police 類別
class PoliceRank {
public:
    std::string code;
    std::string rank;
    
    PoliceRank(const std::string& c, const std::string& r) : code(c), rank(r) {}
};
class Police : public Person {
private:
    PoliceRank police_rank;
public:
    Police(const std::string& id, const std::string& name, const PoliceRank& rank)
        : Person(id, name), police_rank(rank) {}
    std::string GetPersonalInformation() override { // 覆寫方法
        return "身分證:" + id_no + ", 姓名:" + name + ", 職稱:" + police_rank.rank;
    }
    void UpdateRoleTitle(const std::string& newRank) override { // 覆寫方法
        police_rank.rank = newRank;
    }
};
// 範例使用
int main() {
    PoliceRank rank("001", "Sergeant");
    Police officer("A123456789", "John Doe", rank);
    
    std::cout << officer.GetPersonalInformation() << std::endl;
    officer.UpdateRoleTitle("Lieutenant");
    std::cout << officer.GetPersonalInformation() << std::endl;
    return 0;
}
在這段代碼中,GetPersonalInformation 和 UpdateRoleTitle 被 Police 類別覆寫來提供具體的實現。UpdateRoleTitle 接受一個新職稱並更新 PoliceRank 對象。
注意,如果你需要一個運行時多態的行為,應該使用指針或引用來操作 Person 類別的對象。在這個簡單的例子中,我們直接使用了 Police 對象。在一個更複雜的系統中,你可能會有一個 Person 指針的數組來管理多個不同種類的 Person 對象。