假设我有一个班级
TController<T_Ui: TGui; T_Man: TManager> = class
end;
如果我尝试将此类用作此类通用过程的约束:
procedure MyProc<T: TController<T_Ui, T_Man>>(ACont: T);
我收到错误undefined identifier T_Ui
。
是否有比
更短的方法来定义程序procedure MyProc<T_Ui: TGui; TMan: TManager; T: TController<T_Ui, T_Man>>(ACont: T);
如果我想要的只是对TController类型的约束T?
编辑:
如果我可以定义:
procedure MyProc<T: TController<*, *>>(ACont: T);
编译器应该清楚一切
我的问题是,而不是写
MyProc<TMyController>(Cont);
我需要写
MyProc<TMyUi, TMyManager, TMyController>(Cont);
答案 0 :(得分:2)
procedure MyProc<T: TController<T_Ui, T_Man>>(ACont: T);
让我们考虑一下这意味着什么。这是一个通用方法,其中包含一个通用参数T
,该参数必须派生自TController<T_Ui, T_Man>
。由于T_Ui
和T_Man
不是通用参数,因此编译器必须将它们解释为具体类型。您没有定义该名称的类型,因此编译器错误。
但是,您当然不希望编译器将T_Ui
和T_Man
视为具体类型。你的意思是它们是通用参数。在这种情况下,您必须声明它们。
procedure MyProc<T_Ui: TGui; TMan: TManager; T: TController<T_Ui, T_Man>>(ACont: T);
或者也许是这样。
procedure MyProc<T_Ui: TGui; TMan: TManager>(ACont: TController<T_Ui, T_Man>);
通过删除冗余参数T
,这更简单。
本质上,您希望隐式参数化但不存在。必须明确声明通用参数。
现在,有时使用的一种技术是将非泛型类声明为泛型类的基类型。
type
TController = class
....
end;
TController<T_Ui: TGui; T_Man: TManager> = class(TController)
....
end;
然后你可以像这样编写通用方法:
procedure MyProc<T: TController>(ACont: T);
现在,这种方法要求您可以在TController
中声明足够的功能。如果MyProc
需要调用只能在派生自TController
的泛型类中声明的方法,那么这种方法对你没用。