2016-11-12 37 views
7

我創建了兩個單位,並把第一類爲其中之一:不能理解德爾福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'

+1

你的例子和分析非常清楚。這似乎是一個缺陷。向質量門戶提交錯誤報告。 –

+2

在10.2東京地區修正:https://quality.embarcadero.com/browse/RSP-16305 –

回答

12

它看起來像一個錯誤。我建議將它發佈到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. 
+0

不可以。它在Delphi XE6中不起作用。說[dcc32錯誤] UDerClass.pas(45):E2362無法在行函數TDerOuterClass.GetInnerInstance:TBaseOuterClass.TBaseInnerClass;上訪問受保護的符號TBaseOuterClass.TBaseInnerClass; – tikskit

+2

閱讀您的評論,閱讀答案。請注意,評論中的代碼與答案中的代碼不同。使用答案中的代碼。 –

+0

哦,對。它的作品呢!謝謝! – tikskit