【问题标题】:Can't understand Delphi XE6 protected types无法理解 Delphi XE6 保护类型
【发布时间】:2017-03-26 08:07:40
【问题描述】:

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

  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 错误] 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'

【问题讨论】:

标签: delphi delphi-xe6


【解决方案1】:

它看起来像一个错误。我建议将其发布到quality portal

现在你可以声明类型别名来欺骗编译器(在 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 Cannot access protected symbol TBaseOuterClass.TBaseInnerClass at line function TDerOuterClass.GetInnerInstance: TBaseOuterClass.TBaseInnerClass;
  • 阅读您的评论,阅读答案。请注意,您评论中的代码与答案中的代码不同。使用答案中的代码。
  • 有人要提交错误报告吗?
  • @DavidHeffernan 我已经添加了one
  • 非常感谢
猜你喜欢
  • 2014-08-04
  • 2023-03-09
  • 2014-11-09
  • 2014-09-25
  • 2016-12-11
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多