实现内部非静态接口

Mat*_*ski 5 interface ceylon

我想从包装类外部实例化一个内部非静态接口.

这可能吗?

请考虑以下代码:

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

void test() {
    AOuterClass o = AOuterClass();
    object impl satisfies ???.AInterface{}
}
Run Code Online (Sandbox Code Playgroud)

我认为object impl satisfies o.AInterface{}这是我合理的直觉,但编译器不允许它.

Paŭ*_*ann 6

在像你这样的情况下是不可能的.

Ceylon规范说(第4.5.4节类继承):

嵌套类的子类必须是声明嵌​​套类的类型的成员,或者是声明嵌套类的类型的子类型的成员.满足嵌套接口的类必须是声明嵌​​套接口或声明嵌套接口的类型的子类型的类型的成员.

因此,您只能在声明类或其子类中满足嵌套接口.类似的语言用于通过新接口扩展嵌套接口.

这并没有直接提到object声明,但这些仅仅是类定义的快捷方式,稍后将在Anonymous类中进行详细说明:

以下声明:

shared my object red extends Color('FF0000') {
     string => "Red";
}
Run Code Online (Sandbox Code Playgroud)

完全等同于:

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

shared my \Ired red => \Ired.red;
Run Code Online (Sandbox Code Playgroud)

\Ired编译器分配的类型名称在哪里.

所以这也包括object声明作为你的声明.

你可以做什么(我没有测试这个):

AOuterClass.AInterface test(){
    object o extends AOuterClass() {
       shared object impl satisfies AInterface{}
    }
    return o.impl;
}
Run Code Online (Sandbox Code Playgroud)

当然,这不适用于现有AOuterClass对象,仅适用于新创建的对象.看到这允许访问对象的私有值,这似乎是一件好事.