2017-07-27 22 views
5

Tôi muốn tạo một giao diện không tĩnh bên trong từ bên ngoài lớp gói.Thực hiện giao diện không tĩnh bên trong

Điều này có khả thi không?

Xét đoạn mã sau:

shared class AOuterClass() { 
Integer val = 3; 
shared interface AInterface { 
     shared Integer val => outer.val; 
    } 
} 

void test() { 
    AOuterClass o = AOuterClass(); 
    object impl satisfies ???.AInterface{} 
} 

Tôi nghĩ object impl satisfies o.AInterface{} sẽ là trực giác hợp lý của tôi, nhưng trình biên dịch không cho phép nó.

Trả lời

6

Không thể trong trường hợp như của bạn.

Các đặc điểm kỹ thuật Ceylon nói (section 4.5.4 Class Inheritance):

Một lớp con của một lớp lồng nhau phải là thành viên của các loại khai báo lớp lồng nhau hoặc của một subtype của các loại khai báo lớp lồng nhau. Một lớp thỏa mãn giao diện lồng nhau phải là một thành viên của kiểu khai báo giao diện lồng nhau hoặc của một kiểu con của kiểu khai báo giao diện lồng nhau.

Vì vậy, bạn chỉ có thể đáp ứng giao diện lồng nhau bên trong lớp khai báo hoặc trong phân lớp của lớp đó. Có ngôn ngữ tương tự để mở rộng giao diện lồng nhau bằng giao diện mới.

này không trực tiếp đề cập đến object tờ khai, nhưng những người chỉ đơn thuần là một phím tắt cho các định nghĩa lớp, được chi tiết một chút sau, vào Anonymous classes:

Việc kê khai như sau:

shared my object red extends Color('FF0000') { 
    string => "Red"; 
} 

là chính xác tương đương với:

shared final class \Ired of red extends Color { 
    shared new red extends Color('FF0000') {} 
    string => "Red"; 
} 

shared my \Ired red => \Ired.red; 

Nơi \Ired là tên kiểu được trình biên dịch gán.

Vì vậy, điều này cũng bao gồm các tờ khai object làm tờ khai của bạn.

gì bạn có thể làm (tôi đã không kiểm tra này):

AOuterClass.AInterface test(){ 
    object o extends AOuterClass() { 
     shared object impl satisfies AInterface{} 
    } 
    return o.impl; 
} 

Tất nhiên, điều này không làm việc cho một đối tượng AOuterClass hiện có, chỉ dành riêng cho một mới được tạo ra một. Thấy rằng điều này cho phép truy cập một giá trị riêng của một đối tượng, điều này có vẻ là một điều tốt.

+0

Tôi đồng ý, đó là giải pháp đơn giản nhất. (Và có, nó hoạt động.) –

+0

Ý tưởng là tạo và triển khai giao diện từ bên ngoài cho một 'đã'. (Nhưng nó cũng chỉ là một ý tưởng và nó không phải là quan trọng, tôi chỉ tự hỏi nếu tôi có một số cú pháp lừa) –

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