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

C# 虛擬方法、抽象類別與介面完整比較:選型指南與程式碼範例

     編輯:關於C語言

三大機制快速對照

特性虛擬方法抽象方法/類別介面
關鍵字virtual / overrideabstractinterface
基類可具實作是否(抽象方法無主體)否(C# 8.0 前)
衍生類強制實作否(可選擇 override)是是
多重實作單一繼承單一繼承多介面實作
可包含欄位/建構子是是否
存取修飾詞任意任意預設 public,不可標記
靜態成員可可不可(C# 8.0 允許 static 靜態方法)

程式碼範例

1. 虛擬方法:提供預設實作,選擇性覆寫


public class Animal {
    public virtual void Speak() {
        Console.WriteLine("動物發出聲音");
    }
}

public class Dog : Animal {
    public override void Speak() {
        Console.WriteLine("汪汪!");
    }
}

public class Cat : Animal {
    // 不覆寫,使用基類預設
}

2. 抽象類別:定義契約 + 共享實作


public abstract class Shape {
    public abstract double Area(); // 強制實作
    public abstract double Perimeter();

    // 共享實作
    public void PrintInfo() {
        Console.WriteLine($"面積: {Area():F2}, 周長: {Perimeter():F2}");
    }
}

public class Circle : Shape {
    public double Radius { get; set; }
    public override double Area() => Math.PI * Radius * Radius;
    public override double Perimeter() => 2 * Math.PI * Radius;
}

3. 介面:純契約,支援多重實作


public interface ISerializable {
    string Serialize();
    void Deserialize(string data);
}

public interface ICloneable {
    T Clone();
}

// 類別可同時實作多個介面
public class UserProfile : ISerializable, ICloneable {
    public string Name { get; set; }
    public int Age { get; set; }

    public string Serialize() => $"{Name}|{Age}";
    public void Deserialize(string data) {
        var p = data.Split('|');
        Name = p[0]; Age = int.Parse(p[1]);
    }
    public UserProfile Clone() => new UserProfile { Name = this.Name, Age = this.Age };
}

C# 8.0+ 介面新功能

  • 預設實作:介面可提供方法預設主體,減少破壞性變更。
    
    public interface ILogger {
        void Log(string msg);
        void LogWarning(string msg) => Log($"WARN: {msg}"); // 預設實作
    }
    
  • 靜態/私有方法:介面內可定義輔助邏輯。

選型決策樹

  1. 需要**共享程式碼/欄位/建構子** → 抽象類別
  2. 需要**多重實作/契約分離** → 介面
  3. 提供**預設行為但允許選擇性修改** → 虛擬方法
  4. 組合使用:抽象類別實作介面,提供部分預設 → 衍生類別完成細節。

經典組合範例:Repository Pattern


public interface IRepository {
    T GetById(int id);
    IEnumerable GetAll();
    void Add(T entity);
    void Remove(T entity);
}

public abstract class RepositoryBase : IRepository where T : class {
    protected readonly DbContext Context;
    protected RepositoryBase(DbContext ctx) => Context = Context;

    public T GetById(int id) => Context.Set().Find(id);
    public IEnumerable GetAll() => Context.Set().ToList();
    public void Add(T entity) => Context.Set().Add(entity);
    public void Remove(T entity) => Context.Set().Remove(entity);

    public abstract void SaveChanges(); // 強制衍生類別決定儲存策略
}

public class UserRepository : RepositoryBase {
    public UserRepository(DbContext ctx) : base(ctx) { }
    public override void SaveChanges() => Context.SaveChanges();
}

總結

虛擬方法用於**單一繼承體系內的擴展點**;抽象類別用於**建構「半成品」基類,強制子類完成關鍵邏輯**;介面用於**定義跨類別層級的契約,支援多重實作與解耦**。現代 C# 開發傾向 「介面優先,抽象類別輔助共享邏輯」 的組合策略。

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