EnriqueMark
设计模式与架构

CRTP

2026-03 简体中文

CRTP是个很有意思的东西,全称是泛型基类(Curiously Recurring Template Pattern),也就是限定子类输入类型的基类。

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

这里的意思就是,实现I接口,但是带上限制,TJob这个泛型必须是继承自:后续的类,具体可见 继承和约束

这种基类的用途一般都是内部的方法需要一个外部类型来构建逻辑,而这个类型只有在实现的时候才能知道,那就得用 CRTP 了。基类要求子类必须把自己的类型传进来,否则基类就无法正常作用。

虽然一般我们会说「组合优于继承」,但是在复用场景多且内部逻辑依赖一个具体实现时才会传入的类型时,CRTP就是最好用的。否则用组合就必须每次实现的时候重写——反而存在代价。

组合最适合的是那种为了复用而去写继承的时候——这个时候组合反而更好,因为约束关系不强烈,去耦合没必要用可能再耦合的继承模式。

其次则是生命周期管理,组合的话会放在DI容器里去做,继承一般就是上游的基类了。