无法理解Delphi XE6保护类型

前端之家收集整理的这篇文章主要介绍了无法理解Delphi XE6保护类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_403_1@我创建了两个单元并将第一个类放入其中一个:
  1. unit UBaseClass;
  2.  
  3. interface
  4.  
  5. type
  6. TBaSEOuterClass = class
  7. protected type
  8.  
  9. TBaseInnerClass = class
  10. public
  11. end;
  12.  
  13. protected
  14. function GetInnerInstance: TBaSEOuterClass.TBaseInnerClass; virtual;
  15. end;
  16.  
  17. implementation
  18.  
  19. { TBaSEOuterClass }
  20.  
  21. function TBaSEOuterClass.GetInnerInstance: TBaSEOuterClass.TBaseInnerClass;
  22. begin
  23. // doesn't matter
  24. end;
  25.  
  26. end.

我将派生类放入第二个单元:

  1. unit UDerClass;
  2.  
  3. interface
  4.  
  5. uses
  6. UBaseClass;
  7.  
  8. type
  9. TDerOuterClass = class(TBaSEOuterClass)
  10. protected type
  11.  
  12. TDerInnerClass = class(TBaseInnerClass)
  13.  
  14. end;
  15.  
  16. protected
  17. function GetInnerInstance: TBaSEOuterClass.TBaseInnerClass; override;
  18. end;
  19.  
  20. implementation
  21.  
  22. { TDerOuterClass }
  23.  
  24. function TDerOuterClass.GetInnerInstance: TBaSEOuterClass.TBaseInnerClass;
  25. begin
  26.  
  27. end;
  28.  
  29. end.

当我想要编译时,我得到了

[dcc32 Error] UDerClass.pas(22): E2362 Cannot access protected symbol
TBaSEOuterClass.TBaseInnerClass

在行函数TDerOuterClass.GetInnerInstance:TBaSEOuterClass.TBaseInnerClass;

我无法理解为什么TBaSEOuterClass.TBaseInnerClass(作为内部受保护类)无法从TDerOuterClass(为TBaSEOuterClass派生)访问.在这种情况下,实际上受保护的类型是什么?

我在Nested Type Declarations topic没有找到任何解释.所以有这种行为的原因吗?

它也与简单的受保护类型相关

  1. protected type
  2. TSimpleType = Integer;

我无法在TDerOuterClass中编写函数

  1. protected
  2. function GetValue: TSimpleType;

因为我会收到一条消息

[dcc32 Error] UDerClass.pas(16): E2003 Undeclared identifier:
‘TSimpleType’

解决方法

它看起来像一个bug.我建议把它发布到 quality portal.

现在你可以声明类型别名来欺骗编译器(在XE7中测试).

  1. unit UDerClass;
  2.  
  3. interface
  4.  
  5. uses
  6. UBaseClass;
  7.  
  8. type
  9. TDerOuterClass = class(TBaSEOuterClass)
  10. protected type
  11. TBaseInnerClass = TBaSEOuterClass.TBaseInnerClass; // <= type alias to avoid compiler error
  12.  
  13. TDerInnerClass = class(TBaseInnerClass)
  14.  
  15. end;
  16.  
  17. protected
  18. function GetInnerInstance: TBaseInnerClass; override;
  19. end;
  20.  
  21. implementation
  22.  
  23. { TDerOuterClass }
  24.  
  25. function TDerOuterClass.GetInnerInstance: TBaseInnerClass;
  26. begin
  27. Result := TDerInnerClass.Create;
  28. end;
  29.  
  30. end.

猜你在找的Delphi相关文章