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

C# 基礎程式設計練習題與解答(四):OOP 優勢、關鍵字、抽象類別與介面、委派事件、泛型鏈結串列

     編輯:關於C語言

練習 1:面向物件程式設計相較結構化程式設計的優點

  1. 以物件為中心 vs 以流程為中心:OOP 關注物件行為與屬性,封裝資料與操作;結構化著重流程層次分解。
  2. 資料隱藏 vs 公開資料:OOP 透過封裝隱藏內部資料,僅公開介面;結構化資料與流程常公開,易造成耦合。
  3. 獨立單元 vs 單一代碼單元:OOP 物件獨立完整,可獨立部署;結構化基於單一代碼單元。
  4. 高度重用 vs 單次使用:OOP 物件為模組單元,具高度重用性;結構化流程難以重用。
  5. 事件驅動 vs 線性演算法:OOP 應用程式基於訊息/事件驅動(如 Windows);結構化程式結構多為自頂向下線性流程。

練習 2:關鍵字 new、sealed、版本控制

1. new 關鍵字用途

  • 運算子:在堆疊建立物件並呼叫建構函式(如 new MyClass())。
  • 修飾詞:隱藏基類別繼承而來的同名成員(如 public new void Method())。

2. sealed 修飾詞

  • 類別:防止被繼承(sealed class A)。
  • 方法:防止被覆寫(sealed override void Method())。
  • 效能優化:密封類別的虛擬方法呼叫可轉為非虛擬呼叫,提升執行速度。

3. 版本控制關鍵字

  • override:明確覆寫基類別 virtual 方法。
  • new:隱藏基類別方法(非多型行為)。
  • 若兩者皆未指定,編譯器發出警告,預設為隱藏行為。

練習 3:抽象類別與介面的主要差異

核心差異:類別可實作多個介面,但只能繼承單一抽象類別(或任何具體類別)。抽象類別可包含實作與狀態;介面僅定義契約(C# 8.0 前)。


練習 4:委派與事件的優點、差異與關聯

委派優點

  • 類似 C/C++ 函式指標,但具物件導向與型別安全特性。
  • 可將方法參考封裝於委派物件,延遲決定呼叫哪個方法(回呼模式)。

事件

  • 物件發生動作時通知用戶端的機制,常用於 GUI(按鈕點擊等)。
  • 本質是特殊的委派:類別宣告事件,用戶端提供處理方法(委派),事件觸發時呼叫。

關聯

事件使用委派聲明;委派封裝方法供匿名呼叫;事件是類別允許用戶端註冊處理方法的委派介面。


練習 5:建構函式執行順序與輸出

情境 A:衍生類別無建構函式

public class A { public A() { Console.WriteLine("A"); } }
public class B { public B() { Console.WriteLine("B"); } }
public class C : A { B newb = new B(); } // 欄位初始化先於基類別建構函式
class MainClass { public static void Main() { C newc = new C(); } }

輸出: B → A(欄位初始化 → 基類別建構函式 → 衍生類別建構函式)。

情境 B:衍生類別加上建構函式 public C() { Console.WriteLine("C"); }

輸出: B → A → C。


練習 6:虛擬方法覆寫與多型

public class A {
    public virtual void MyMethod(int num) { num += 10; Console.WriteLine(num); }
}
public class B : A {
    public override void MyMethod(int num) { num += 50; Console.WriteLine(num); }
}
class MainClass {
    public static void Main() {
        A a = new A(); a.MyMethod(2); // 12
        B b = new B(); b.MyMethod(2); // 52
    }
}

練習 7:鏈結串列節點類別——非泛型與泛型實作

非泛型版本(使用 Object)

class Node {
    object m_data; Node m_next;
    public Node(object data, Node next) { m_data = data; m_next = next; }
    public object Data { get { return m_data; } }
    public Node Next { get { return m_next; } }
    public override string ToString() { return m_data.ToString(); }
}

泛型版本(Node<T>)

class Node {
    T m_data; Node m_next;
    public Node(T data, Node next) { m_data = data; m_next = next; }
    public T Data { get { return m_data; } set { m_data = value; } }
    public Node Next { get { return m_next; } set { m_next = value; } }
    public override string ToString() { return m_data.ToString(); }
}

使用範例

class LinkedList {
    static void Main() {
        // 泛型整數鏈結串列
        Node head = new Node(5, null);
        head = new Node(10, head);
        head = new Node(15, head);

        int sum = 0;
        for (Node cur = head; cur != null; cur = cur.Next)
            sum += cur.Data;

        Console.WriteLine("Sum of nodes = {0}", sum); // 30
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved