使用泛型和嵌套记录助手的继承

7

我正在尝试在Delphi 10.1 Berlin中进行以下操作,但编译器返回消息"F2084 Internal Error: AV0A785E48-R000000-10-0":

TMyType = (mtValue1, mtValue2);

TMyBaseClass = class
private
  FMyType: TMyType;
public
  property MyType: TMyType read FMyType write FMyType;
end;

TMyClass = class(TMyBaseClass)
private
  FOtherField: Integer;
public
  property OtherField: Integer read FOtherField write FOtherField;
end;

TMyBaseProcess1<T: TMyBaseClass> = class
strict private
  FMyClass: T;
strict protected
  type
    TMyTypeHelper = record Helper for TMyType
    public
      function ToString: string;
    end;
public
  constructor Create(AMyClass: T);
  procedure DoSomething;
end;

TMyProcess1 = class(TMyBaseProcess1<TMyClass>)
end;

TMyBaseProcess2<T: TMyBaseClass> = class
strict private
  FMyClass: T;
strict protected
  type
    TMyTypeHelper = record Helper for TMyType
    public
      function ToInteger: Integer;
    end;
public
  constructor Create(AMyClass: T);
  procedure DoSomethingElse;
end;

TMyProcess2 = class(TMyBaseProcess2<TMyClass>)
end;

TMyBaseProcess1中的辅助程序与TMyBaseProcess2中的完全不同。我可以轻易地将辅助程序和类分开。我只想知道为什么不能把它们放在一起。

有人知道问题出在哪里吗?我能否以这种方式使用泛型、嵌套记录助手和继承?


1
编译器缺陷。请提交错误报告。嵌套泛型类型的记录助手看起来有点奇怪。 - David Heffernan
你不能直接编写实现而不使用记录助手吗? - Alberto Miola
David Heffernan。感谢您的帮助。我的示例仅用于演示。实际情况有所不同。 - Lucas Felipe Silva
1
肯定是编译器的缺陷,因为内部编译错误(ICE)总是如此。但是这段代码本来可能就无法编译。辅助函数和泛型实例化确实毫无意义。不使用这种结构重新编写代码吧。 - David Heffernan
Ken White:感谢您的帮助。 - Lucas Felipe Silva
显示剩余2条评论
1个回答

1

您不能拥有指向相同类类型的两个助手,在您的情况下是TMyType

来自文档..

您可以定义并关联多个帮助程序与单个类型。但是,在源代码中的任何特定位置,只有零个或一个帮助程序适用。

在那些类之外使用帮助程序

TMyTypeHelper = record Helper for TMyType
    public
      function ToInteger: Integer;
      function ToString: string; 
    end;

但是我一次只使用一个帮助程序。这不可能吗? - Lucas Felipe Silva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接