2026-06-22 C# 新增實現 IPaymentMethod 的類別, 要怎麼新增

2026-06-22 C# 新增實現 IPaymentMethod 的類別, 要怎麼新增

我:
在 2. 引入接口 (Programming to an Interface)
public interface IPaymentMethod
{
void ProcessPayment(decimal amount);
}

public class CreditCardPayment : IPaymentMethod
{
public void ProcessPayment(decimal amount)
{
Console.WriteLine($”Processing credit card payment of {amount}”);
}
}

public class PaymentProcessor
{
private IPaymentMethod _paymentMethod = new CreditCardPayment(); // 依然是硬編碼的依賴

public void CompletePurchase(decimal amount)
{
    _paymentMethod.ProcessPayment(amount);
}

}

妳說增加支付方式時 , 只需新增實現 IPaymentMethod 的類別,
要怎麼新增, 比如說轉帳、 paypal

GPT:
要新增不同的支付方式(例如銀行轉帳和 PayPal),我們可以創建新的類別,並讓這些類別實現 IPaymentMethod 介面。這樣就能保證每個支付方式都有 ProcessPayment 方法,並可以根據需要完成相應的處理。

以下是如何新增兩種支付方式:銀行轉帳和 PayPal:

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
37
38
39
40
41
42
public interface IPaymentMethod
{
void ProcessPayment(decimal amount);
}

// CreditCardPayment 類別
public class CreditCardPayment : IPaymentMethod
{
public void ProcessPayment(decimal amount)
{
Console.WriteLine($"Processing credit card payment of {amount}");
}
}

// BankTransferPayment 類別
public class BankTransferPayment : IPaymentMethod
{
public void ProcessPayment(decimal amount)
{
Console.WriteLine($"Processing bank transfer payment of {amount}");
}
}

// PayPalPayment 類別
public class PayPalPayment : IPaymentMethod
{
public void ProcessPayment(decimal amount)
{
Console.WriteLine($"Processing PayPal payment of {amount}");
}
}

// PaymentProcessor 類別
public class PaymentProcessor
{
private IPaymentMethod _paymentMethod = new CreditCardPayment(); // 這裡仍然是硬編碼

public void CompletePurchase(decimal amount)
{
_paymentMethod.ProcessPayment(amount);
}
}

如何使用新支付方式

如果要切換成 BankTransferPaymentPayPalPayment,你只需要將 PaymentProcessor 類別中的 _paymentMethod 改為新的實例。例如:

1
private IPaymentMethod _paymentMethod = new PayPalPayment(); // 使用 PayPalPayment

或者

1
private IPaymentMethod _paymentMethod = new BankTransferPayment(); // 使用 BankTransferPayment

這樣做會使 PaymentProcessor 能夠適配不同的支付方式,而不必改動其他代碼。

我:
所以像 2. 引入接口 (Programming to an Interface) 的方式,
那如果要新增支付方式, 就還是要修改 public class PaymentProcessor {
裡面的這段程式:
private IPaymentMethod _paymentMethod = new CreditCardPayment(); // 這裡仍然是硬編碼
就是把 new CreditCardPayment() , 改成我要的支付方式,
比如是 轉帳 , 就是 new BankTransferPayment() , 對嗎?

GPT:
是的,你的理解是正確的!在這種情況下,PaymentProcessor 類別內部的 _paymentMethod 仍然是硬編碼的依賴。這意味著如果你想新增支付方式,就需要在 PaymentProcessor 類別中手動修改這段程式碼。

例如,如果你希望將支付方式從信用卡改為銀行轉帳,你需要將以下這行:

1
private IPaymentMethod _paymentMethod = new CreditCardPayment(); // 這裡仍然是硬編碼

改成:

1
private IPaymentMethod _paymentMethod = new BankTransferPayment(); // 改為銀行轉帳支付

這樣的缺點

這種方式的缺點是你必須每次都手動更改 PaymentProcessor 類別的代碼,這可能導致代碼不易維護和擴展,尤其是在有多個地方使用 PaymentProcessor 的情況下。

如何改善?

為了避免這個問題,你可以使用依賴注入(Dependency Injection)來注入支付方法,這樣就不需要在 PaymentProcessor 類別中硬編碼支付方式。具體的做法可以參考以下示例:

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
public class PaymentProcessor
{
private IPaymentMethod _paymentMethod;

// 透過建構子注入支付方法
public PaymentProcessor(IPaymentMethod paymentMethod)
{
_paymentMethod = paymentMethod;
}

public void CompletePurchase(decimal amount)
{
_paymentMethod.ProcessPayment(amount);
}
}

// 使用示例
public class Program
{
public static void Main(string[] args)
{
// 在這裡選擇使用哪一種支付方式
IPaymentMethod paymentMethod = new BankTransferPayment();
PaymentProcessor processor = new PaymentProcessor(paymentMethod);
processor.CompletePurchase(100.00m);
}
}

這樣,你只需要在創建 PaymentProcessor 的時候決定使用哪一種支付方式,而不需要修改 PaymentProcessor 的內部代碼。這種方法更符合開放-封閉原則(Open/Closed Principle),即對擴展開放,對修改封閉。