【问题标题】:Using generic interface in the constraint of another generic class declaration在另一个泛型类声明的约束中使用泛型接口
【发布时间】:2016-05-17 11:35:25
【问题描述】:

使用Delphi 10 Seattle,是否可以使用一个泛型接口作为另一个泛型类定义的接口约束?

我有这个接口声明:

IrmOpenAPIConfigurationItemRequest<REQUESTDATA, RESPONSE> = interface(IrmOpenAPIRequest)
  procedure DoSomething;
end;

我想声明一个具有上述类型的泛型类作为约束,所以我可以在TBaseConfigItem_Model的实现中使用DoSomething方法。

TBaseConfigItem_Model<REQUEST: IrmOpenAPIConfigurationItemRequest<REQUESTDATA, RESPONSE>> = class(...);

这给出了编译错误:未声明的标识符'REQUESTDATA'

我怎样才能做到这一点?

附:为了清楚起见,省略了一些实现细节

【问题讨论】:

    标签: delphi generics


    【解决方案1】:

    您当然可以使用泛型接口作为约束,但您确实需要引入缺少的泛型参数。这就是编译器错误消息告诉您的内容。以下编译:

    type
      TBaseConfigItem_Model<REQUESTDATA; RESPONSE; REQUEST: 
        IrmOpenAPIConfigurationItemRequest<REQUESTDATA, RESPONSE>> = class
      public
        procedure DoSomething;
      end;
    

    【讨论】:

    • 感谢您的回答,它确实可以编译,但不需要 REQUEST 参数,因为我现在可以声明一个类型的变量; IrmOpenAPIConfigurationItemRequest
    • 请记住,我只能看到问题中的内容,而没有您所拥有的全局。我想我回答了你问的问题,不是吗?
    • 哦,感谢您在通用约束中更正了我的语法。我总是忘记那个问题。也许这就是您的评论的意思。
    • 它是否也适用于类作为约束?例如我有一个像这样的泛型类定义:TShape&lt;TVertexType: TVertex&gt; 所以我可以声明另一个泛型类,比如:TModel&lt;TVertexType; TShape&lt;TVertexType&gt;&gt;?它不编译。我想强制 TModel<...> 的任何子类必须使用 TShape 的子类。
    猜你喜欢
    • 1970-01-01
    • 2019-06-27
    • 2020-11-28
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2023-03-06
    相关资源
    最近更新 更多