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

介面與抽象類抉择指南:從「是什麼」到「能做什麼」的建模思維

     編輯:關於.NET

核心原則

  • 抽象類:建模「是什麼」(固有屬性、共享實作)
  • 介面:建模「能做什麼」(行為契約、多型能力)

案例一:多重能力組合的困境

// 錯誤嘗試:C# 不支援多重繼承
public abstract class SingerDancer : Singer, Dancer { }

問題:Singer、Dancer 繼承 Person,導致 SingerDancer 無法多重繼承,且違反單一職責。

介面重構方案

// 行為介面
public interface ISing { void SingSong(); }
public interface IDance { void Dance(); }

// 具體角色實作介面
public abstract class Singer : Person, ISing { public void SingSong() { } }
public abstract class Dancer : Person, IDance { public void Dance() { } }

// 組合能力
public abstract class SingerDancer : Person, ISing, IDance {
    public void SingSong() { }
    public void Dance() { }
}

透過介面分離「唱歌」「跳舞」行為,SingerDancer 可同時實作多介面,符合介面隔離原則。

案例二:企鵝不是會飛的鳥

// 錯誤設計:強制所有鳥會飛
public abstract class Bird { public abstract void Fly(); }
public abstract class Penguin : Bird { } // 企鵝不會飛,違反里氏替換原則

介面修正方案

public abstract class Bird { } // 基類僅含共性
public interface IFly { void Fly(); }

public abstract class Crow : Bird, IFly { }
public abstract class Pigeon : Bird, IFly { }
public abstract class Penguin : Bird { } // 不實作 IFly,完美符合

將「飛行」抽象為介面,只有會飛的鳥實作,企鵝自然不受影響。

決策速查表

場景選擇理由
定義核心身分、共享預設實作抽象類表達「是一種」關係,提供共同基礎
定義可選行為、跨層級複用介面表達「能做某事」,支援多重實作
需要版本控制、二進制相容性抽象類可新增非抽象成員不破壞現有代碼
頻繁變動、多組件獨立演進介面契約穩定,實現細節可獨立變更

總結

**「抽象類建模名詞(名詞導向),介面建模動詞(動詞導向)」。** 遇到多重能力組合、行為不普遍共享時,優先考慮介面組合而非繼承層次深化。

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