Delphi:泛型和类型约束

时间:2009-11-12 14:20:16

标签: delphi generics class constraints

是否可以将通用类型约束为两个不同的类?

像这样:

TSomeClass<T: FirstClass; T: SecondClass> = class
  // ...
end;

(抱歉没有格式化 - SO工具栏已从我的浏览器中消失)。 我知道上面的内容不会编译,它的编写只是为了给你们一个想法。我试过了

TSomeClass<T: FirstClass, SecondClass> = class
  // ...
end;

但后来我不允许写

procedure TSomeClass.SomeMethod<T> (Param1: string);

这甚至可能吗?

2 个答案:

答案 0 :(得分:10)

不,这是不可能的。编译器应该如何能够静态验证方法调用是否有效?

注意,

TSomeClass <T : FirstClass, SecondClass>

不是有效的类型约束。您不能组合多个类约束。您可以将类约束与某些接口约束组合在一起。但即便如此

TSomeClass <T : TSomeClass, ISomeInterface>

表示通用类型必须来自TSomeClass 实现ISomeInterface

所以你唯一能做的就是提取FirstClassSecondClass之间常见的东西,把它放在一个接口中并使用一个接口约束:

TSomeClass <T : IOnePointFive>

也许你可以提供一些关于你想要达到的目标的更多细节。

答案 1 :(得分:2)

让两个类实现相同的接口是可行的方法。然后将泛型约束到该接口。