2017-07-27 12 views
5

Chciałbym utworzyć instancję wewnętrznego niestatycznego interfejsu spoza klasy zawijania.Implementowanie wewnętrznego niestatycznego interfejsu

Czy to możliwe?

Rozważmy następujący kod:

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

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

myślę object impl satisfies o.AInterface{} byłaby moja intuicja rozsądne, ale kompilator nie pozwoli.

Odpowiedz

6

Nie jest to możliwe w przypadku takim jak Twój.

Specyfikacja Cejlon mówi (section 4.5.4 Class Inheritance)

Podklasa zagnieżdżonej klasie musi należeć do typu, który zgłasza zagnieżdżony klasy lub z podtypem typu, który zgłasza zagnieżdżony klasy. Klasa spełniająca interfejs zagnieżdżony musi być członkiem typu, który deklaruje zagnieżdżony interfejs lub podtypem typu, który deklaruje zagnieżdżony interfejs.

Dzięki temu można zagnieździć interfejs zagnieżdżony wewnątrz klasy deklarującej lub w jej podklasie. Podobny język służy do rozszerzenia zagnieżdżonego interfejsu o nowy interfejs.

nie bezpośrednio wspomnieć object deklaracji, ale są to jedynie skrót do definicji klas, jak określono nieco później, w Anonymous classes:

Oświadczenie o następującej treści:

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

Czy dokładnie odpowiednik:

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

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

Gdzie \Ired to nazwa typu przypisana przez kompilator.

To również obejmuje deklaracje object jako swoją.

Co może być w stanie to zrobić (nie testowałem tego):

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

Oczywiście, to nie działa dla istniejącej AOuterClass obiektu, tylko dla nowo utworzonej jeden. Widząc, że pozwala to na dostęp do prywatnej wartości obiektu, wydaje się, że to dobrze.

+0

Zgadzam się, to najprostsze rozwiązanie. (I tak, to działa). –

+0

Pomysł polegał na stworzeniu i implementacji interfejsu z zewnątrz dla danego "o". (Ale to był też tylko pomysł i nie jest to ważne, po prostu zastanawiałem się, czy jest jakiś sztuczka składni) –

Powiązane problemy