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

C# 抽象類別基礎:無法直接實例化、透過衍生類別多型使用

     編輯:關於C語言

核心規則:抽象類別不可實例化

using System;

abstract class MyClass { }

class Program {
    static void Main() {
        // 編譯錯誤:Cannot create an instance of the abstract class
        // MyClass obj = new MyClass();
        Console.ReadKey();
    }
}

正確用法:透過衍生類別實例化

using System;

abstract class Parent { }
class Child : Parent { }

class Program {
    static void Main() {
        Parent obj = new Child(); // 多型:父類別參考指向子類別實例
        Console.WriteLine(obj.GetType().Name); // Child
        Console.ReadKey();
    }
}

抽象類別 vs 介面:選擇指南

維度抽象類別介面
多重實作單一繼承多重實作
成員類型方法、屬性、欄位、建構函式、常數方法、屬性、事件、索引子(C# 8.0+ 可有預設實作)
存取修飾詞完整支援隱含 public
共用狀態/邏輯支援(欄位、非抽象方法)不支援(無狀態)
版本演進新增非抽象成員不破壞相容C# 8.0 前新增成員破壞相容

何時使用抽象類別

  • 需要共用欄位/建構函式/私有輔助方法
  • 定義「是一種」關係且有共同預設行為(如 Animal → Dog/Cat)
  • 需要版本化演進,且大多數實作共享邏輯

何時使用介面

  • 定義「能做什麼」能力契約(如 IFlyable/ISwimmable)
  • 需支援多重實作
  • 跨越繼承體系的橫向關注點

最佳實踐:抽象類別實作介面

interface IRepository {
    T GetById(int id);
    void Save(T entity);
}

abstract class RepositoryBase : IRepository {
    protected abstract T FindById(int id); // 子類別實作細節
    protected abstract void Persist(T entity);

    public T GetById(int id) {
        var entity = FindById(id);
        if (entity == null) throw new KeyNotFoundException();
        return entity;
    }

    public void Save(T entity) {
        Validate(entity);
        Persist(entity);
    }

    protected virtual void Validate(T entity) { } // 可選擇覆寫
}

class UserRepository : RepositoryBase {
    protected override User FindById(int id) => /* DB 查詢 */;
    protected override void Persist(User entity) => /* DB 寫入 */;
}

此模式結合抽象類別共用流程控制與介面定義契約,兼具彈性與複用性。

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