从构造函数中引用内部 class
Reference inner class from constructor
我有一个不可变的容器式 class。
class Foo[+T](val arg: T) {
// ...
}
我想创建一个 Foo
的子class,它有一个内部对象作为它的参数。
class Bar extends Foo[this.Inner.type](this.Inner) {
object Inner {
// ...
}
// ...
}
我希望它是一个内部对象(而不是一个单独的对象),因为我确实需要访问 Bar
中的私有数据。然而,当我尝试编译该代码时,我得到:
Example.scala:6: error: this can be used only in a class, object, or
class Bar extends Foo[this.Inner.type](this.Inner) {
^
Example.scala:6: error: this can be used only in a class, object, or template
class Bar extends Foo[this.Inner.type](this.Inner) {template
^
是否可以使用内部对象作为参数调用 superclass 构造函数?如果是这样,我做错了什么?
已编辑
为了回应一些评论,我想我应该给出更多的细节。我的 class Foo
实际上专门化为 Foo[+T <: SomeAbstractClass]
并且它定义了几个在 SomeAbstractClass
实例上运行的操作。我想创建一个 subclass Bar
,它的行为既像 Foo
又像它的底层 SomeAbstractClass
。由于我不能让 Bar
从两个 class 继承,我认为内部对象是下一个最好的东西。真的,我特别想要的是 Bar
和 Inner
,它们分别充当 Foo
容器和 SomeAbstractClass
元素,并且可以完全访问彼此的私有变量。
由于您内在的路径依赖性 object
,您尝试做的事情无法完成。也就是说,每次执行以下操作时:
val obj1 = new Bar(...){
def lala(inner: Inner) = ...
}
val obj2 = new Bar(...)
obj1.lala(obj2.Inner) //won't compile!!
实际的 Inner
对象被重新定义。它不会编译,因为 obj1
上的 Inner
与 obj2
上的 Inner
不同。他们不是一个类型的!
因此,您要做的是在完全确定范围和定义之前引用某物的定义。这是编译器会报错的原因之一。
解释了为什么这不能按照我想要的方式完成,但我想我会 post 对我有类似效果的解决方案。我最终写了一个包含 Bar
和 Inner
的外部 class,它可以与变量上的正确访问修饰符自由交互。
class BarContainer {
object Bar extends Foo[Inner.type](this.Inner) {
// Any private fields should be declared private[BarContainer]
// ...
}
object Inner {
Bar.x = 3
// ...
}
}
我有一个不可变的容器式 class。
class Foo[+T](val arg: T) {
// ...
}
我想创建一个 Foo
的子class,它有一个内部对象作为它的参数。
class Bar extends Foo[this.Inner.type](this.Inner) {
object Inner {
// ...
}
// ...
}
我希望它是一个内部对象(而不是一个单独的对象),因为我确实需要访问 Bar
中的私有数据。然而,当我尝试编译该代码时,我得到:
Example.scala:6: error: this can be used only in a class, object, or
class Bar extends Foo[this.Inner.type](this.Inner) {
^
Example.scala:6: error: this can be used only in a class, object, or template
class Bar extends Foo[this.Inner.type](this.Inner) {template
^
是否可以使用内部对象作为参数调用 superclass 构造函数?如果是这样,我做错了什么?
已编辑
为了回应一些评论,我想我应该给出更多的细节。我的 class Foo
实际上专门化为 Foo[+T <: SomeAbstractClass]
并且它定义了几个在 SomeAbstractClass
实例上运行的操作。我想创建一个 subclass Bar
,它的行为既像 Foo
又像它的底层 SomeAbstractClass
。由于我不能让 Bar
从两个 class 继承,我认为内部对象是下一个最好的东西。真的,我特别想要的是 Bar
和 Inner
,它们分别充当 Foo
容器和 SomeAbstractClass
元素,并且可以完全访问彼此的私有变量。
由于您内在的路径依赖性 object
,您尝试做的事情无法完成。也就是说,每次执行以下操作时:
val obj1 = new Bar(...){
def lala(inner: Inner) = ...
}
val obj2 = new Bar(...)
obj1.lala(obj2.Inner) //won't compile!!
实际的 Inner
对象被重新定义。它不会编译,因为 obj1
上的 Inner
与 obj2
上的 Inner
不同。他们不是一个类型的!
因此,您要做的是在完全确定范围和定义之前引用某物的定义。这是编译器会报错的原因之一。
Bar
和 Inner
的外部 class,它可以与变量上的正确访问修饰符自由交互。
class BarContainer {
object Bar extends Foo[Inner.type](this.Inner) {
// Any private fields should be declared private[BarContainer]
// ...
}
object Inner {
Bar.x = 3
// ...
}
}