【问题标题】:Inheritance with generics and nested record helper使用泛型和嵌套记录助手进行继承
【发布时间】:2017-07-21 05:19:03
【问题描述】:

我试图在 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 中的助手完全不同。我可以毫无问题地将助手和类分开。我只想知道为什么我不能让他们在一起。

有谁知道问题出在哪里?我可以这样使用泛型、嵌套记录助手和继承吗?

【问题讨论】:

  • 编译器缺陷。提交错误报告。嵌套泛型类型的记录助手看起来很奇怪。
  • 不使用记录助手就不能直接写实现吗?
  • 大卫赫弗南。谢谢您的帮助。我的示例仅用于演示。实际情况有点不同。
  • 阿尔贝托·米奥拉:对不起这个例子。这只是一个测试用例,而不是真实情况。在实际情况下我无法直接在记录中实现。我将更改示例以获得更好的示例。
  • 肯定是编译器缺陷,ICE 总是这样。但是代码可能无论如何都不应该编译。助手和通用实例化真的没有意义。编写没有该结构的代码。

标签: delphi generics inheritance record helper


【解决方案1】:

你不能有 两个 帮助器指向相同的类类型 在你的情况下 TMyType

来自文档..

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

在该类之外使用帮助器

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

【讨论】:

  • 但我一次只使用一个助手。不可能吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多