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
相关产品推荐
相关产品推荐

