2016-11-12 14 views
7

tôi tạo ra hai đơn vị và đặt một lớp đầu tiên vào một trong số họ:Không thể hiểu Delphi XE6 loại bảo vệ

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. 

Và tôi đặt một lớp được thừa kế thành một đơn vị thứ hai:

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. 

khi tôi đang cố gắng để biên dịch tôi nhận được

[dcc32 Lỗi] UDerClass.pas (22): E2362 không thể truy cập được bảo vệ biểu tượng TBaseOuterClass.TBaseIn nerClass

tại dòng chức năng TDerOuterClass.GetInnerInstance: TBaseOuterClass.TBaseInnerClass;

Tôi không thể hiểu tại sao TBaseOuterClass.TBaseInnerClass (như lớp bảo vệ bên trong) không thể truy cập từ TDerOuterClass (có nguồn gốc cho TBaseOuterClass). Điều gì trong trường hợp này là các loại được bảo vệ thực sự?

Tôi chưa tìm thấy giải thích nào cho điều này tại Nested Type Declarations topic. Vì vậy, có bất kỳ lý do cho hành vi này?

Nó cũng liên quan đến các loại bảo vệ đơn giản như

protected type  
    TSimpleType = Integer; 

tôi không thể viết một hàm trong TDerOuterClass

protected  
    function GetValue: TSimpleType; 

kể từ khi tôi sẽ nhận được một thông điệp

[dcc32 Lỗi] UDerClass.pas (16): E2003 Số nhận dạng không khai báo: 'TSimpleType'

+1

Ví dụ và phân tích của bạn rất rõ ràng. Điều này dường như là một khiếm khuyết. Gửi báo cáo lỗi cho Cổng thông tin chất lượng. –

+2

Cố định ở 10.2 Tokyo: https://quality.embarcadero.com/browse/RSP-16305 –

Trả lời

12

Dường như lỗi. Tôi sẽ đề nghị để đăng nó vào quality portal.

Hiện tại, bạn có thể khai báo loại bí danh để lừa trình biên dịch (được kiểm tra trong 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

Không. Nó không hoạt động trong Delphi XE6. Nói [dcc32 Lỗi] UDerClass.pas (45): E2362 Không thể truy cập biểu tượng được bảo vệ TBaseOuterClass.TBaseInnerClass tại dòng chức năng TDerOuterClass.GetInnerInstance: TBaseOuterClass.TBaseInnerClass; – tikskit

+2

Đọc bình luận của bạn, đọc câu trả lời. Lưu ý rằng mã trong nhận xét của bạn khác với mã trong câu trả lời. Sử dụng mã trong câu trả lời. –

+0

Ồ, đúng vậy. Nó hoạt động sau đó! Cảm ơn! – tikskit

Các vấn đề liên quan