【问题标题】:How do I implement a generic class that has an constraint for a generic interface?如何实现具有泛型接口约束的泛型类?
【发布时间】:2018-02-17 15:33:32
【问题描述】:

我有一个界面

IMyInterface<T>

还有一个班级

TMyClass<T>

现在我希望我只能将类作为一种类型传递给 TMyClass,它也实现了 IMyInterface。

第一次尝试

TMyClass<T:IMyInterface<T>>

但正如预期的那样,现在编译器希望我给他一个实现接口的类型与实现接口的类本身的类型

第二次尝试

TMyClass<D,T:IMyInterface<D>> 

我认为,D 将是共享的 DataType,TMyInterface 和 TMyClass 都会使用。

所以在声明了实现接口的类之后

TMyIntegerClass = class(TInterfacedObject,IMyInterface<Integer>)

声明

GMyClass:TMyClass<Integer,TMyIntegerClass>

编译器错误失败:

E2514 Type parameter 'D' must support interface 'IMyInterface<System.Integer>' 

任何指针?

【问题讨论】:

  • 用分号代替逗号怎么样:TMyClass&lt;D; T: IMyInterface&lt;D&gt;&gt;,类似于函数的参数?
  • 这没什么区别。此时的语法仍然可以,但变量声明中出现相同的编译器错误。
  • 哦,是的,它肯定会有所作为。看我的回答。

标签: delphi generics interface


【解决方案1】:

这在 Delphi 10.2.2 Tokyo 中编译:

type
  IMyInterface<T> = interface
  ['{F810B6BC-78F7-4026-BA83-70435150B758}']
  end;

  TMyClass<D; T: IMyInterface<D>> = class // note the semicolon!
  end;

  TMyIntegerClass = class(TInterfacedObject, IMyInterface<Integer>)
  end;

var
  GMyClass: TMyClass<Integer, TMyIntegerClass>;

如果,在类的声明中,我使用&lt;D, T: TSomeType&gt;(逗号!),那么DT 都被声明为同一类型 strong>,类似于函数的参数:

procedure Blah(D, T: TSomeType);

参数DT属于同一类型,即TSomeType

现在,如果您将 Integer 传递给 D,则会收到与您遇到的错误类似的错误。编译器需要两个 TSomeType 参数。

但如果我使用&lt;D; T: TSomeType&gt;,那么DT单独的类型,即D 是未知类型,TTSomeType 类型。所以现在,Dnot 声明为 TSomeType,如果您通过 Integer,则不会出现错误。

哦,还有this is documented too

【讨论】:

  • 是的,很抱歉它确实有效,在错误的课程上尝试过...设置为接受的答案:)
猜你喜欢
  • 2015-04-05
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
相关资源
最近更新 更多