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 | public interface IPaymentMethod |
如何使用新支付方式
如果要切換成 BankTransferPayment 或 PayPalPayment,你只需要將 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 | public class PaymentProcessor |
這樣,你只需要在創建 PaymentProcessor 的時候決定使用哪一種支付方式,而不需要修改 PaymentProcessor 的內部代碼。這種方法更符合開放-封閉原則(Open/Closed Principle),即對擴展開放,對修改封閉。