← SEARCHABLE ARCHIVE
C# · 2026-07-25

C# 從基礎到精通 — 第 4 講

將角色分為繼承、介面和泛型

INTERACTIVE READING MODE →

該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。

當多個類別需要提供相同的行為時,可以使用繼承和介面。 向外界呈現什麼樣的契約比將事物捆綁在一起更重要。

透過介面表達角色

public interface IDamageable
{
    bool IsAlive { get; }
    void TakeDamage(int amount);
}

public sealed class Monster : IDamageable
{
    public int Health { get; private set; } = 100;
    public bool IsAlive => Health > 0;

    public void TakeDamage(int amount)
    {
        Health = Math.Max(0, Health - amount);
    }
}

對於攻擊程式碼,你只需要知道IDamageable,而不是整個Monster。 您稍後可以使用相同的代碼添加訓練稻草人或可破壞的盒子。

繼承用於 is-a 關係

public abstract class Skill
{
    public string Name { get; }

    protected Skill(string name) => Name = name;
    public abstract void Execute(IDamageable target);
}

public sealed class FireSkill : Skill
{
    public FireSkill() : base("Fire") { }

    public override void Execute(IDamageable target)
    {
        target.TakeDamage(30);
    }
}

繼承也繼承了基底類別的狀態和規則。 如果您只是為了重複使用幾行程式碼而建立深度繼承結構,則對父級的變更將影響所有子級。

使用泛型維護類型安全

public sealed class Registry<T> where T : class
{
    private readonly Dictionary<int, T> values = new();

    public void Add(int id, T value) => values.Add(id, value);

    public T? Find(int id)
    {
        return values.TryGetValue(id, out T? value) ? value : null;
    }
}

Registry<Monster>和Registry<Skill>使用相同的儲存規則,但它們的值不能混合。 約束 where 告訴編譯器 T 必須提供哪些屬性。

介面表達角色,繼承表達公共基礎,泛型表達不同類型的相同規則。 與其同時使用這三個函數中的許多函數,不如先創建最小的合約並在必要時進行擴展更安全。