Delphi中的“嵌套”类型约束

时间:2016-01-31 22:22:54

标签: delphi delphi-xe4

假设我有一个班级

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);

1 个答案:

答案 0 :(得分:2)

procedure MyProc<T: TController<T_Ui, T_Man>>(ACont: T);

让我们考虑一下这意味着什么。这是一个通用方法,其中包含一个通用参数T,该参数必须派生自TController<T_Ui, T_Man>。由于T_UiT_Man不是通用参数,因此编译器必须将它们解释为具体类型。您没有定义该名称的类型,因此编译器错误。

但是,您当然不希望编译器将T_UiT_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的泛型类中声明的方法,那么这种方法对你没用。