实现内部非静态接口

时间:2017-07-27 18:30:14

标签: 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{}
}

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

1 个答案:

答案 0 :(得分:6)

在您的情况下不可能。

Ceylon规范说(section 4.5.4 Class Inheritance):

  

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

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

这并没有直接提到object声明,但这些仅仅是类定义的捷径,稍后会在Anonymous classes详细阐述:

  

以下声明:

      
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;
}

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