2017-07-27 2 views
5

Ich möchte eine innere nicht-statische Schnittstelle von außerhalb der Wrapping-Klasse instanziieren.Interne nicht-statische Schnittstelle implementieren

Ist das möglich?

Betrachten Sie den folgenden Code ein:

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

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

Ich denke, object impl satisfies o.AInterface{} würde meine vernünftige Intuition, aber der Compiler erlaubt es nicht.

Antwort

6

In einem Fall wie Ihrem ist es nicht möglich.

Der Ceylon-Spezifikation sagt (section 4.5.4 Class Inheritance):

Eine Unterklasse von einer verschachtelten Klasse ein Mitglied der Typ sein, der die verschachtelte Klasse oder eines Subtyps des Typs erklärt, die die verschachtelte Klasse deklariert. Eine Klasse, die eine verschachtelte Schnittstelle erfüllt, muss Mitglied des Typs sein, der die verschachtelte Schnittstelle deklariert, oder eines Subtyps des Typs, der die verschachtelte Schnittstelle deklariert.

So können Sie nur eine verschachtelte Schnittstelle innerhalb der deklarierenden Klasse oder in einer Unterklasse davon erfüllen. Eine ähnliche Sprache gibt es, um eine verschachtelte Schnittstelle durch eine neue Schnittstelle zu erweitern.

Dies erwähnt nicht direkt object Erklärungen, aber das ist nur eine Abkürzung für Klassendefinitionen, wie etwas später, in Anonymous classes erarbeitet:

Die folgende Erklärung:

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

ist genau entspricht:

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

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

Wo \Ired ist der vom Compiler zugewiesene Typname.

So deckt dies auch object Deklarationen als Ihr ein.

Was Sie könnten in der Lage sein zu tun (ich habe das nicht getestet):

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

Natürlich funktioniert das nicht für ein bestehendes AOuterClass Objekt, nur für einen neu erstellen. Da dies den Zugriff auf einen privaten Wert eines Objekts ermöglicht, scheint dies eine gute Sache zu sein.

+0

Ich stimme zu, das ist die einfachste Lösung. (Und ja, es funktioniert.) –

+0

Die Idee war, die Schnittstelle von außen für ein bestimmtes 'o' zu erstellen und zu implementieren. (Aber es war auch nur eine Idee und es ist nicht wichtig, ich habe mich nur gefragt, ob ich einen Syntax-Trick habe) –

Verwandte Themen