我創建了兩個單位,並把第一類爲其中之一:不能理解德爾福XE6保護類型
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.TBaseIn nerClass
在行函數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東京地區修正:https://quality.embarcadero.com/browse/RSP-16305 –