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

C# 抽象方法與抽象類別:強制實作契約與衍生鏈傳遞機制

     編輯:關於C語言

抽象方法基本規則

using System;

abstract class Parent {
    // 抽象方法:隱含 virtual,不可加 static/virtual
    public abstract void Method1();

    // 抽象類別可包含非抽象成員
    public void Method2() { Console.WriteLine("Method2"); }

    // 甚至可包含靜態成員
    public static void Method3() { Console.WriteLine("Method3"); }
}

class Child : Parent {
    // 必須用 override 實作
    public override void Method1() { Console.WriteLine("Method1"); }
}

class Program {
    static void Main() {
        Parent.Method3(); // 靜態成員透過類別呼叫
        Child.Method3();  // 衍生類別也可呼叫基底靜態成員

        Parent obj = new Child(); // 多型
        obj.Method1(); // Method1
        obj.Method2(); // Method2
        Console.ReadKey();
    }
}

抽象類別在繼承鏈中的傳遞

若中間類別同樣宣告為 abstract,則可延遲實作:

abstract class Parent {
    public abstract void Method1();
}

abstract class Child1 : Parent {
    // 不實作 Method1,繼續保持抽象
}

class Child2 : Child1 {
    // 最終具象類別必須實作所有抽象成員
    public override void Method1() { Console.WriteLine("Method1"); }
}

class Program {
    static void Main() {
        Parent obj = new Child2();
        obj.Method1(); // Method1
        Console.ReadKey();
    }
}

核心概念總結

特性抽象方法虛擬方法介面方法
必須實作是(除非衍生類別也為 abstract)否(可選擇覆寫)是(實作介面的類別)
可有預設實作否是C# 8.0+ 可有預設實作
存取修飾詞public/protected/internal同左隱含 public
靜態/密封不可 static/sealed可 static/sealed不可 static/sealed

設計原則

  • Template Method Pattern:抽象類別定義演算法骨架,抽象方法留待子類別填充細節。
  • 預設實作上移:共用邏輯放在抽象類別的非抽象方法,減少重複程式碼。
  • 介面優於抽象類別:若無共用狀態/實作,優先用介面定義契約,保持鬆耦合。

常見錯誤

  1. abstract static void Method() → 編譯錯誤,靜態成員無法多型
  2. abstract private void Method() → 編譯錯誤,私有成員不可覆寫
  3. 忘記在具象類別實作所有抽象成員 → 編譯錯誤
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved