四、抽象(abstract)類別、介面(interface) 、覆寫(override)方法、多載(overload) 方法是物件導向程式設計實現多型(polymorphism)的方式。下圖是人 事系統中人員基本資料維護的類別圖,請說明類別圖中的覆寫方法及多 載方法名稱(須說明理由) ,並使用 C++, Java 或 Python 程式語言撰寫 Person 類別與 Police 類別的程式碼。Police 類別之 GetPersonalInformation 函數必須傳回身分證(id_no) 、姓名(name) 、職稱(rank) ,UpdateRoleTitle 函數必須完整實作更新 police_rank。
詳解 (共 1 筆)
詳解
在這個類別圖中,Person 是一個抽象類別,因為它有抽象方法(在UML中以斜體表示):GetPersonalInformation 和 UpdateRoleTitle。這意味著它們在 Person 類別中不具備具體的實現,必須由繼承 Person 類別的子類別來實現,這就是方法的覆寫。
Police 和 Staff 是 Person 類別的具體子類別。它們必須實現(覆寫)Person 類別的抽象方法,提供這些方法的具體實現。
多載(Overloading)是指在同一範圍中有多個具有相同名稱但參數不同的方法。在這個類別圖中沒有明確表示有多載方法,因為多載通常會在同一類別中以不同的參數數量或類型來呈現。
以下是 Person 類別和 Police 類別的C++實現:
cpp
Copy code
#include <iostream>
#include <string>
Copy code
#include <iostream>
#include <string>
// 抽象基類別 Person
class Person {
protected:
std::string id_no;
std::string name;
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() {}
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; // 抽象方法
};
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 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;
private:
PoliceRank police_rank;
public:
Police(const std::string& id, const std::string& name, const PoliceRank& rank)
: Person(id, name), police_rank(rank) {}
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;
}
return "身分證:" + id_no + ", 姓名:" + name + ", 職稱:" + police_rank.rank;
}
void UpdateRoleTitle(const std::string& newRank) override { // 覆寫方法
police_rank.rank = newRank;
}
};
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;
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 對象。
}
在這段代碼中,GetPersonalInformation 和 UpdateRoleTitle 被 Police 類別覆寫來提供具體的實現。UpdateRoleTitle 接受一個新職稱並更新 PoliceRank 對象。
注意,如果你需要一個運行時多態的行為,應該使用指針或引用來操作 Person 類別的對象。在這個簡單的例子中,我們直接使用了 Police 對象。在一個更複雜的系統中,你可能會有一個 Person 指針的數組來管理多個不同種類的 Person 對象。