【发布时间】:2014-10-30 10:29:23
【问题描述】:
我有一个基类
TEventMulticaster = class(Tobject)
public
procedure Notify(aMap: WideString);
end;
procedure TEventMulticaster.Notify(aMap: WideString);
begin
// Do something
end;
还有一个派生的泛型类
TEventMulticaster<T> = class(TEventMulticaster)
public
procedure Notify(aMap: T ); reintroduce;
end;
procedure TEventMulticaster<T>.Notify(aMap: T);
begin
inherited Notify(aMap) // ERROR
end;
当基类 Notify 被调用时,它会给我错误“不兼容的类型:'WideString' 和 'T'”
当我做**Notify(WideString(aMap))** 时,它说无效的类型转换
我的问题是如何将泛型类型转换为“WideString”,以便我可以调用基类notify
【问题讨论】:
-
您不能将任意泛型参数类型转换为
WideString。你为什么要这样做。如果aMap是TMainForm,代表您的应用程序的主要形式的类,您会期望发生什么?在实现泛型方法时,您必须考虑到,泛型类型绝对可以是任何东西。现在,您可以应用约束,但它们有些受限。另外,你为什么使用WideString。除非您正在调用 COM 方法,否则您应该停止使用它。使用string,UnicodeString的别名。 -
这对我来说没有意义,但是,
inherited Notify(WideString(TValue.From<T>(aMap).AsString));。或inherited Notify(TValue.From<T>(aMap).AsType<WideString>);. -
我这样做是因为超过 10 个类是从基类“TEventMulticaster”派生的,它们都在做同样的事情,但类型不同,所以我用泛型函数创建泛型类并执行我的操作.并且 aMap 不是类型类。
-
你的问题的答案是你不能这样做。这对你不是很有帮助。除非您提出潜在问题,否则我们很难为您提供更一般的建议,我认为这是您所需要的。至于您所说的“aMap 不是类型类”,它对编译器并不真正持有任何货币。就它而言,
T可以是任何东西,因为你说过它可以是任何东西。这几乎就是泛型存在的理由。
标签: delphi generics delphi-xe2 delphi-xe5 delphi-xe4