如何实现对通用接口具有约束的泛型类?

时间:2018-02-17 15:33:33

标签: delphi generics interface

我有一个界面

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>' 

任何指针?

1 个答案:

答案 0 :(得分:4)

编译在Delphi 10.2.2东京:

def solution(side): 
    result = (side**2)*(3**(0.5))/4 
    return round(result,2)
print(solution(6))  # prints 15.59

如果在类的声明中,我使用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>; (逗号!),则<D, T: TSomeType>D 都被声明为相同类型的,如函数的参数:

T

参数procedure Blah(D, T: TSomeType); D属于同一类型,即T

现在,如果您为TSomeType传递Integer,则会收到错误,类似于您获得的错误。编译器需要两个D参数。

但如果我使用TSomeType,那么<D; T: TSomeType>D单独的类型,即T属于未知类型且{{1}类型为D。现在,T 声明为TSomeType,如果您通过D则没有错误。

哦,this is documented too