首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 封裝、多型與物件關係進階:事件驅動、值類型參考類型深度剖析

     編輯:關於C語言

一、封裝:資訊隱藏與介面隔離

封裝核心在於將實作細節隱藏於類別內部,僅透過公開介面(屬性、方法)與外界互動。呼叫端只需知道「做什麼」,無需關心「怎麼做」。


Person man = new Person("Lixiao", "woman", 11, 88);
man.Eat(12); // 呼叫端不知 Eat 內部如何修改 Weight

好處:

  • 降低耦合度,內部實作可隨時重構不影響呼叫端
  • 集中驗證邏輯於屬性 set 或方法內,保護資料完整性
  • 隱藏複雜度,簡化使用者認知負擔

二、多型:重載與覆寫的雙重機制

1. 方法重載

同一類別內,方法名相同、參數列表不同(型別、數量、順序),回傳型別可同可不同:


public void Hi() => Console.WriteLine("Hi, C#");
public void Hi(string name) => Console.WriteLine($"Hi, {name}");

編譯期根據引數型別綁定對應方法(靜態多型)。

2. 方法覆寫

衍生類重新定義基類 virtual 或 abstract 成員,嚴格要求:

  • 方法名、參數列表、回傳型別完全相同
  • 基類成員標記 virtual、abstract 或 override
  • 存取修飾詞不可比基類更嚴格

執行期根據物件實際型別動態派發(動態多型)。

3. 覆寫範例:Person.GetWeight → Student 覆寫

基類方法 衍生類覆寫

4. 多型帶來的統一處理能力


class Student : Person { }
class Worker : Person { }

Student s = new Student(); s.Eat(15);
Worker w = new Worker();   w.Eat(15);
// 相同語法,實際執行 Person.Eat 或各自覆寫版本

三、物件間關係:繼承之外的組合與聚合

關係定義生命週期典型案例
繼承Is-a(是一種)子類依賴父類Student : Person
包含/組合Has-a(擁有),強擁有部分隨整體銷毀Car 包含 Engine
聚合/集合Has-a,弱關聯部分可獨立存在Department 包含多個 Employee

集合 vs 陣列

  • 陣列:固定大小、型別單一、效能最佳
  • 集合(List<T>、ArrayList):動態增刪、支援索引/排序/搜尋、Item 屬性按索引存取

Student[] students = new Student[20]; // 陣列
// 集合範例
var list = new List();
list.Add(new Student());
list.RemoveAt(0);

四、事件驅動程式設計:回應使用者互動

事件是物件狀態變化的通知機制,Windows Forms/WPF 大量使用。範例:按鈕點擊計數器:


int count = 0;
private void button1_Click(object sender, EventArgs e)
{
    count++;
    textBox1.Text = count.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
    count--;
    textBox1.Text = count.ToString();
}

事件驅動範例介面

事件模式:發布者宣告事件 → 訂閱者註冊處理器 → 觸發時自動回呼。

五、值類型與參考類型:記憶體模型本質差異

特性值類型參考類型
儲存內容直接包含資料儲存指向資料的參考(位址)
記憶體位置Stack(棧)或內嵌於物件Heap(堆)
指派行為複製資料本身複製參考,指向同一物件
預設值型別零值(0, false, 結構體零初始化)null
典型型別int, double, struct, enumclass, string, array, delegate

關鍵行為差異示意


// 值類型:獨立副本
int a = 10; int b = a; b = 20; // a 仍為 10

// 參考類型:共享參考
StringBuilder s1 = new StringBuilder("Hello");
StringBuilder s2 = s1;
s2.Append(" World"); // s1 也變成 "Hello World"

理解此差異對避免非預期副作用、設計不可變型別、優化效能至關重要。

總結

封裝建立清晰邊界,多型提供彈性擴展,組合/聚合實現鬆耦合物件圖,事件驅動支援互動式應用,值/參考類型區別決定資料流向與記憶體行為。五大支柱共同構成 C# 進階物件導向設計的完整知識體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved