You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中如何用嵌套泛型避免重复编写嵌套子类继承层级

你之前写法错误的核心原因是:TClassB是泛型类型,作为约束时必须补全它所需的泛型参数,你直接写B: TClassB编译器无法识别未特化的泛型类型作为约束。

正确实现方案

第一步:定义基础泛型类层级

// 基础TClassA无改动
TClassA = class(TObject)
end;

// TClassB仅需约束自身Child字段的类型为TClassA的子类
TClassB<A: TClassA> = class(TObject)
public
  Child: A;
end;

// TClassC需要传入两个泛型参数,先约束A的范围,再约束B为传入A参数的TClassB特化子类
TClassC<A: TClassA; B: TClassB<A>> = class(TObject)
public
  Child: B;
end;

第二步:直接通过泛型特化得到自定义层级,无需编写整套继承代码

// 仅需编写你要扩展的自定义A类即可
TMyClassA = class(TClassA)
  // 可在此添加自定义属性、方法
end;

// 直接通过泛型别名得到对应自定义类型的B、C类,无需额外写继承代码
type
  TMyClassB = TClassB<TMyClassA>;
  TMyClassC = TClassC<TMyClassA, TMyClassB>;

调用示例(编译期类型安全)

procedure Test;
var
  CInst: TMyClassC;
begin
  CInst := TMyClassC.Create;
  CInst.Child := TMyClassB.Create;
  // 此处Child.Child自动为TMyClassA类型,无需强制类型转换,编译期即可检查类型合法性
  CInst.Child.Child := TMyClassA.Create;

  // 后续释放逻辑省略
end;

可选优化

如果你觉得每次传两个参数给TClassC太麻烦,可以再封装一层单参数的泛型别名:

type
  TSimpleClassC<T: TClassA> = TClassC<T, TClassB<T>>;

// 使用时仅需传入自定义A类的类型即可,效果和之前完全一致
type
  TMyClassCSimple = TSimpleClassC<TMyClassA>;

内容的提问来源于stack exchange,提问作者zeus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:06:02