2026-06-21 C# 硬編碼依賴 (Tightly Coupled Code) 的語法妳

2026-06-21 C# 硬編碼依賴 (Tightly Coupled Code) 的語法妳

我:
對於 1. 1. 硬編碼依賴 (Tightly Coupled Code) 的語法妳可以一行一行詳細說明嗎? 什麼類別 、變數的、如何宣告

GPT:
當然,讓我們逐行分析 硬編碼依賴 (Tightly Coupled Code) 的語法和設計。這裡有兩個主要的類別:

  1. CreditCardPayment:代表一種支付方式。
  2. PaymentProcessor:處理支付的主要類別。

在此設計中,PaymentProcessor 直接依賴於 CreditCardPayment,因此在程式中是“硬編碼”的依賴關係。

1
2
3
4
5
6
7
public class CreditCardPayment
{
public void ProcessPayment(decimal amount)
{
Console.WriteLine($"Processing credit card payment of {amount}");
}
}

逐行解釋

  • **public class CreditCardPayment**:

    • 這行宣告了一個名為 CreditCardPayment 的公共類別,這是一個支付方式的具體實現。
    • 關鍵字 public 表示這個類別可以從其他類別或命名空間訪問。
    • 類別的名稱 CreditCardPayment 顯示它的用途:處理信用卡支付。
  • **public void ProcessPayment(decimal amount)**:

    • 這行宣告了一個名為 ProcessPayment 的公共方法,用於處理支付。
    • void 表示此方法沒有返回值。
    • 方法參數 (decimal amount) 用於接收支付的金額,decimal 類型適合表示精確的小數值,通常用於金融計算。
  • **Console.WriteLine($"Processing credit card payment of {amount}");**:

    • 這行代碼會打印出支付的訊息,用來模擬支付處理的過程。
    • $ 表示字符串插值,可以直接在字符串中插入變數或表達式的值。
    • 這裡的 {amount} 會被替換為 amount 的值,構建出 "Processing credit card payment of 100.0" 類似的輸出。

1
2
3
4
5
6
7
8
9
public class PaymentProcessor
{
private CreditCardPayment _paymentMethod = new CreditCardPayment();

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

逐行解釋

  • **public class PaymentProcessor**:

    • 宣告一個名為 PaymentProcessor 的公共類別,表示支付處理器。
    • PaymentProcessor 類別的責任是完成支付流程。
  • **private CreditCardPayment _paymentMethod = new CreditCardPayment();**:

    • 宣告了一個私有變數 _paymentMethod,其類型為 CreditCardPayment
    • private 關鍵字表示 _paymentMethod 只能在 PaymentProcessor 類別內部使用。
    • _paymentMethod 被初始化為一個新的 CreditCardPayment 實例,這裡的 new CreditCardPayment() 表示直接在程式內部創建該依賴。
    • 因此,PaymentProcessor 只能使用 CreditCardPayment 作為支付方式,形成“硬編碼依賴”。
  • **public void CompletePurchase(decimal amount)**:

    • 宣告一個名為 CompletePurchase 的公共方法,用於完成購買。
    • 方法的參數 (decimal amount) 代表交易的金額。
  • **_paymentMethod.ProcessPayment(amount);**:

    • 調用 _paymentMethodProcessPayment 方法來完成支付。
    • 這裡 _paymentMethod 依賴於具體的 CreditCardPayment 類別,這是“硬編碼依賴”的一部分。

總結

在這種設計中,PaymentProcessor 無法輕易地支持其他支付方式,因為它依賴於 CreditCardPayment 的具體實現。

我:
private CreditCardPayment _paymentMethod = new CreditCardPayment();
這個意思是 創建一個名稱為 _paymentMethod 的變數, 這個變數的類型為類(class) , 然後賦予初始化, 這個初始化是用CreditCardPayment來初始化,
那為什麼 CreditCardPayment 後面要加上() 刮弧呢?

GPT:
在這裡 new CreditCardPayment() 後的括號 () 是用來呼叫 CreditCardPayment 類別的**建構子 (constructor)**。

為什麼需要 () 括號

  • 呼叫建構子:當你寫 new CreditCardPayment()() 表示呼叫這個類別的建構子。建構子是一個特殊的方法,會在物件被創建時自動執行,用於初始化物件的狀態。

  • 初始化過程:若 CreditCardPayment 類別中有自訂的建構子,或即使沒有自訂建構子,C# 也會有一個隱含的無參數建構子,即空參數的 CreditCardPayment()。這樣的呼叫表示創建類別的實例並且執行基礎的初始化。

new CreditCardPayment() 中,() 不僅是語法上的要求,也表達了對物件初始化的需求。如果類別中有其他參數化的建構子,例如 CreditCardPayment(int accountId),則必須提供相應的參數才能創建該類型的實例。

我:
什麼叫 呼叫建構子?

GPT:
呼叫建構子 (Calling a Constructor) 是指在創建物件時,自動執行該類別的建構子方法以初始化物件的狀態。建構子是一種特殊的方法,用來設定物件初始值或進行必要的初始化工作,以便物件能夠正常運行。

什麼是建構子?

建構子 (Constructor) 是一個和類別同名的方法,且沒有回傳值。在 C# 中,當你使用 new 關鍵字創建一個物件時,這個建構子就會被呼叫。

建構子的用途

  • 初始化物件屬性:可以用來設定物件的初始屬性值。
  • 依賴注入:可以用來接收參數,將外部依賴注入到物件中。
  • 設定預設值或執行初始邏輯:例如開啟檔案、建立資料庫連線等等。

例子:建構子的基本使用

以下是帶有建構子的簡單範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Person
{
public string Name;
public int Age;

// 這是一個建構子
public Person(string name, int age)
{
Name = name; // 將參數 name 設定給屬性 Name
Age = age; // 將參數 age 設定給屬性 Age
}
}

// 呼叫建構子來創建 Person 物件
Person person = new Person("Alice", 30); // 呼叫建構子並傳入 "Alice" 和 30

呼叫建構子的過程

  1. 使用 new 關鍵字new 關鍵字會創建 Person 類別的新物件,並在該物件上呼叫 Person 類別的建構子。
  2. 傳遞參數new Person("Alice", 30) 會將 "Alice"30 傳入建構子,並將這些值分別賦予 NameAge 屬性。
  3. 返回物件:建構子執行完後,person 變數會指向新創建並初始化的 Person 物件。

沒有參數的建構子

如果類別內沒有自訂建構子,C# 會自動提供一個無參數建構子

1
2
3
4
5
6
7
8
public class Person
{
public string Name = "Unknown";
}

// 無參數建構子會自動被呼叫
Person person = new Person(); // 使用內建的無參數建構子
Console.WriteLine(person.Name); // Output: Unknown

在這個例子中,Person 類別沒有建構子,所以當呼叫 new Person() 時,C# 提供了一個隱含的無參數建構子,並將 Name 的初始值設為 "Unknown"

我:
public class Person
{
public string Name = “Unknown”;
}
所以這段的隱含建構子是:
public class Person
{
public Person{} //隱含建構子
public string Name = “Unknown”;
}
是這樣嗎?

GPT:
接近了!在這段範例中,隱含建構子的寫法其實是這樣的:

1
2
3
4
5
6
7
8
9
10
11
public class Person
{
// 隱含建構子(無參數)
public Person()
{
// 不需要特別的初始化邏輯
}

// 屬性 Name 的初始值設為 "Unknown"
public string Name = "Unknown";
}

這個隱含建構子在實際情況中不需要我們手動寫出。只要類別內部沒有定義任何建構子,C# 編譯器就會自動生成這個無參數建構子。