我有一个特征Bar
,其自我类型为Foo
。 Bar
包含的成员只能Foo
,而不是Foo
个孩子中的任何一个,应该能够访问:
trait Foo {
private val x = new X
}
trait Bar {
this: Foo =>
<protected> class X
}
我使用<protected>
表示我需要一个访问修饰符,允许Foo
访问类X
但不允许访问所有子类。
(注意:我知道在这个简化的例子中我可以在private class X
内声明Foo
并完全摆脱Bar
,但这不是我需要的。这是一个最小的玩具示例 - 我的生产用例是类X
实际上是一个非常大(300+行)的私有类定义,我想在一个单独的文件中定义该类。)
还要注意这个问题是在多年前的here之前提出的,但是接受的答案完全避开了这个问题。最后,我的问题是不是this one的副本 - 实际上,情况恰恰相反。
我可以将上述内容定义为:
trait Foo {
private val x = new X
private class X {
...
}
}
但是如果类X
长达数百或数千行,我希望它在一个单独的文件中 - 因此是自我类型Bar
。
这可能吗?
如果没有,这是Scala语言的固有限制,是否有SIP或其他计划来解决它?