【发布时间】: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'
【问题讨论】:
-
你的例子和分析很清楚。这似乎是一个缺陷。向质量门户提交错误报告。
-
在 10.2 东京版中修复:quality.embarcadero.com/browse/RSP-16305
标签: delphi delphi-xe6