2017-07-27 36 views
5

ラッピングクラスの外側から内部非静的インターフェイスをインスタンス化したいと思います。内部非静的インターフェイスの実装

これは可能ですか?私はobject impl satisfies o.AInterface{}は私の合理的な直感になると思いますが、コンパイラがそれを許さない

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

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

は、次のコードを考えてみましょう。

答えて

6

あなたのような場合はお受けできません。

セイロン仕様は、(section 4.5.4 Class Inheritance)言う:

ネストされたクラスのサブクラスでは、ネストされたクラスを宣言またはネストされたクラスを宣言型のサブタイプの種類のメンバーでなければなりません。ネストされたインターフェイスを満たすクラスは、ネストされたインターフェイスを宣言するタイプのメンバー、またはネストされたインターフェイスを宣言するタイプのサブタイプでなければなりません。

したがって、宣言クラスまたはそのサブクラス内でネストされたインターフェイスを満たすことができます。同様の言語は、新しいインターフェイスによってネストされたインターフェイスを拡張するためのものです。

これAnonymous classesに、少し後詳述として、直接object宣言に言及したが、それらは単にクラス定義のショートカットですされていません。

次の宣言:

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

正確です以下に相当する:

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

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

\Iredは、コンパイラによって割り当てられた型名です。

したがって、これはまたあなたの宣言としてobjectをカバーします。

あなたが行うことができるかもしれない何

(私はこれをテストしていない):もちろん

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

、これはちょうど、新しく作成された1のために、既存のAOuterClassオブジェクトでは動作しません。これがオブジェクトのプライベートな値にアクセスすることを可能にすることを見て、これは良いことであるようです。

+0

私はそれが最も簡単な解決策だと思います。 (とはい、それは動作します。) –

+0

アイデアは、外部から指定された 'o'のインタフェースを作成し実装することでした。 (しかしそれはちょうどアイデアであり、重要ではない、私はいくつかの構文トリックがあるかどうか疑問に思った) –

関連する問題