2026-06-18 C# 設計一個員工系統要如何思考類別及接口,抽象及繼承?

2026-06-18 C# 設計一個員工系統要如何思考類別及接口,抽象及繼承?

我:
所以當我設計一個員工系統, 我要先將基本元素先找出來, 比如說他是正式員工, 兼職員工, 工讀生, 實習生, 每類員工會有各自的基本薪資計算, 加保狀況, 福利, 紅利,加級津貼, 勞保, 健保,退休提撥, 獎金制度等, 相同的基本資料可能有員工編號, 姓名, 銀行帳號 …那麼要如何思考類別及接口,抽象及繼承?
GPT:
你理解得非常透徹!設計這樣的員工系統時,確實需要仔細分析每一個元素,包括基本信息、薪資結構和其他福利,然後再確定如何使用接口、抽象類和繼承來組織這些特性。以下是設計的一些步驟建議:

1. 確定基本的「員工」屬性和操作

分析後,你可以抽象出一些通用屬性,例如:

  • 共通屬性:如員工編號、姓名、銀行帳號等。
  • 共同行為:如計算薪資 GetSalary(),這是所有員工都必須具備的行為。

這些共通屬性和行為通常可以放在一個抽象類 EmployeeBase 中,作為所有員工類型的基礎類別。

2. 將特定功能模組化為接口

分析每種員工類型(正式、兼職、工讀、實習)的差異,並將這些差異功能模組化成接口:

  • 例如:

    • IBonusCalculable 接口,用於定義獎金計算的行為。
    • IInsuranceEligible 接口,用於定義保險的資格和計算(如勞保、健保)。
    • IPensionContributable 接口,用於定義退休金提撥。

這些接口允許系統只給需要這些功能的員工類別去實現,保留靈活性。

3. 將共通的「基礎行為」放入抽象類

可以設計一個抽象類 EmployeeBase,它包含員工的基本屬性和部分共通的行為,例如顯示員工基本資訊(DisplayEmployeeInfo())。EmployeeBase 可以實現一些基本方法,例如:

  • **DisplayEmployeeInfo()**:顯示姓名、員工編號等共通信息。
  • **GetSalary()**:將基本薪資計算邏輯放在這裡,然後讓具體類別可以進行額外計算(如紅利、獎金等)。
1
2
3
4
5
6
7
8
9
10
11
12
13
public abstract class EmployeeBase
{
public string EmployeeID { get; set; }
public string Name { get; set; }
public string BankAccount { get; set; }

public abstract decimal GetSalary();

public void DisplayEmployeeInfo()
{
Console.WriteLine($"ID: {EmployeeID}, Name: {Name}, Bank Account: {BankAccount}");
}
}

4. 具體員工類別的實現

接下來,為各員工類別實現所需的接口和抽象類。例如,正式員工可能實現 IBonusCalculableIInsuranceEligible,而兼職員工可能只實現 IInsuranceEligible

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class PermanentEmployee : EmployeeBase, IBonusCalculable, IInsuranceEligible
{
public decimal BaseSalary { get; set; }
public decimal Allowance { get; set; }

public override decimal GetSalary()
{
return BaseSalary + Allowance + CalculateBonus();
}

public decimal CalculateBonus()
{
// 獎金計算邏輯
}

public bool IsEligibleForInsurance()
{
// 保險資格邏輯
}
}

public class PartTimeEmployee : EmployeeBase, IInsuranceEligible
{
public decimal HourlyRate { get; set; }
public int HoursWorked { get; set; }

public override decimal GetSalary()
{
return HourlyRate * HoursWorked;
}

public bool IsEligibleForInsurance()
{
// 保險資格邏輯
}
}

5. 系統擴展性

這樣設計的系統可以讓新類型的員工(例如實習生)輕鬆加入,只需繼承 EmployeeBase 並實現必要的接口,而不會影響其他類別的邏輯。

  • 如果未來需要添加新的功能,如加級津貼或其他福利,你只需設計一個新接口,然後讓需要的員工類型實現它即可,這樣保持了系統的靈活性和擴展性。

總結

這樣的設計達到了接口和抽象類的最佳組合。接口用來模組化特定功能,抽象類用來定義共通基礎行為,而具體員工類別則負責各自的特定實現。這樣的架構既保持了代碼的組織性,又讓系統具備良好的擴展能力。