私人成员的自我类型:斯卡拉的限制?

时间:2018-02-08 03:35:27

标签: scala self-type

我有一个特征Bar,其自我类型为FooBar包含的成员只能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或其他计划来解决它?

0 个答案:

没有答案