EnriqueMark
設計模式與架構

CRTP

2026-03 繁體中文

CRTP是個很有意思的東西,全稱是泛型基類(Curiously Recurring Template Pattern),也就是限定子類輸入型別的基類。

public abstract class JobBase<TJob> : IJobDefinition
   where TJob : JobBase<TJob>

這裡的意思就是,實現I介面,但是帶上限制,TJob這個泛型必須是繼承自:後續的類,具體可見 繼承和約束

這種基類的用途一般都是內部的方法需要一個外部型別來構建邏輯,而這個型別只有在實現的時候才能知道,那就得用 CRTP 了。基類要求子類必須把自己的型別傳進來,否則基類就無法正常作用。

雖然一般我們會說「組合優於繼承」,但是在複用場景多且內部邏輯依賴一個具體實現時才會傳入的型別時,CRTP就是最好用的。否則用組合就必須每次實現的時候重寫——反而存在代價。

組合最適合的是那種為了複用而去寫繼承的時候——這個時候組合反而更好,因為約束關係不強烈,去耦合沒必要用可能再耦合的繼承模式。

其次則是生命週期管理,組合的話會放在DI容器裡去做,繼承一般就是上游的基類了。