2016-11-12 10 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에서 파생 된) TDerOuterClass에서 TBaseOuterClass.TBaseInnerClass (내부 보호 클래스로)에 액세스 할 수없는 이유를 이해할 수 없습니다. 이 경우 실제로 보호 된 유형은 무엇입니까?

Nested Type Declarations topic에 대한 설명이 없습니다. 그래서이 행동에 대한 이유가 있습니까? 내가 메시지

[DCC32을 얻을 것이기 때문에 나는 TDerOuterClass

protected  
    function GetValue: TSimpleType; 

의 기능을 쓸 수 없습니다 그것은

protected type  
    TSimpleType = Integer; 

같은 간단한 보호 유형도 관련이

오류] UDerClass.pas (16) : E2003 선언되지 않은 식별자 : 'TSimpleType'

+1

귀하의 사례와 분석은 매우 명확합니다. 이것은 결함 인 것 같습니다. 버그 리포트를 Quality Portal에 제출하십시오. –

+2

10.2 Tokyo에서 수정 됨 : 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

Nope. Delphi XE6에서는 작동하지 않습니다. [dcc32 오류] UDerClass.pas (45) : E2362 라인 함수 TDerOuterClass.GetInnerInstance에서 보호 된 심볼 TBaseOuterClass.TBaseInnerClass에 액세스 할 수 없습니다. TBaseOuterClass.TBaseInnerClass; – tikskit

+2

의견을 읽고 답변을 읽어보십시오. 주석의 코드가 응답의 코드와 다릅니다. 답안의 코드를 사용하십시오. –

+0

아, 맞아. 그것은 그 때 일한다! 감사! – tikskit