无法理解Delphi XE6中的受保护类型

7

我创建了两个单位,并将一个第一类放入其中一个单位:

  unit UBaseClass;

  interface

  type
    TBaseOuterClass = class
    protected type

      TBaseInnerClass = class
      public
      end;

    protected
      function GetInnerInstance: TBaseOuterClass.TBaseInnerClass; virtual;
    end;

  implementation

  { TBaseOuterClass }

  function TBaseOuterClass.GetInnerInstance: TBaseOuterClass.TBaseInnerClass;
  begin
  // doesn't matter
  end;

  end.

我把一个派生类放到了第二个单元中:

unit UDerClass;

interface

uses
  UBaseClass;

type
  TDerOuterClass = class(TBaseOuterClass)
  protected type

    TDerInnerClass = class(TBaseInnerClass)

    end;

  protected
    function GetInnerInstance: TBaseOuterClass.TBaseInnerClass; override;
  end;

implementation

{ TDerOuterClass }

function TDerOuterClass.GetInnerInstance: TBaseOuterClass.TBaseInnerClass;
begin

end;

end.

当我尝试编译时,出现以下错误信息:
[dcc32 Error] UDerClass.pas(22): E2362 无法访问受保护的符号 TBaseOuterClass.TBaseInnerClass
该错误出现在函数 TDerOuterClass.GetInnerInstance: TBaseOuterClass.TBaseInnerClass; 的代码行。
我不明白为什么 TBaseOuterClass.TBaseInnerClass(作为内部受保护类)无法从 TDerOuterClass(派生自 TBaseOuterClass)中访问。在这种情况下,受保护类型的实际用途是什么?
我在 Nested Type Declarations topic 中没有找到任何解释。那么,这种行为背后是否有原因?
这也与简单的受保护类型相关。
protected type    
  TSimpleType = Integer;

我无法在 TDerOuterClass 中编写函数

protected    
  function GetValue: TSimpleType;

由于我会收到一条消息

[dcc32错误] UDerClass.pas(16): E2003未声明的标识符: 'TSimpleType'


1
你的示例和分析非常清晰。这似乎是一个缺陷。请向质量门户提交错误报告。 - David Heffernan
2
修复于10.2东京版本:https://quality.embarcadero.com/browse/RSP-16305 - Jeroen Wiert Pluimers
1个回答

12

看起来像是一个bug。建议将其发布到质量门户

目前,您可以声明类型别名来欺骗编译器(在XE7中测试过)。

unit UDerClass;

interface

uses
  UBaseClass;

type
  TDerOuterClass = class(TBaseOuterClass)
  protected type
    TBaseInnerClass = TBaseOuterClass.TBaseInnerClass; // <= type alias to avoid compiler error

    TDerInnerClass = class(TBaseInnerClass)

    end;

  protected
    function GetInnerInstance: TBaseInnerClass; override;
  end;

implementation

{ TDerOuterClass }

function TDerOuterClass.GetInnerInstance: TBaseInnerClass;
begin
  Result := TDerInnerClass.Create;
end;

end.

不行,在Delphi XE6中无法工作。错误信息为[dcc32 Error] UDerClass.pas(45): E2362,无法在函数TBaseOuterClass.TBaseInnerClass的第45行访问受保护的符号TBaseOuterClass.TBaseInnerClass。 - tikskit
2
阅读您的评论,阅读答案。请注意,您评论中的代码与答案中的代码不同。请使用答案中的代码。 - David Heffernan
有人会提交一个错误报告吗? - David Heffernan
2
@DavidHeffernan 我已经添加了一个 - tikskit
非常感谢。 - David Heffernan

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