强制特征由对象实现
Force trait to be implemented by an Object
如何强制 scala 中的特征只能由对象扩展(而不是 classes、特征等)?
我有以下星座:
trait Outer { self: SomeOtherClass =>
def member: Inner.type = Inner
/* some other methods... */
trait Inner { iself =>
def parent: self.type = self
/* other methods... */
}
}
我的问题是:如何强制内部特征必须由对象实现(如 object Inner extends Inner{...})?
我希望每个 class 实现 Outer 的对象都有一个内部对象,它携带一些状态 + 从外部获得内部的可能性,反之亦然。
此致,
约臣
编辑:
示例:
// compiles
class C extends Outer {
object Inner extends Inner { ... }
}
// doesn't compile
class C extends Outer {
class Inner extends Inner { ... }
}
使用 Singleton
自我类型:
trait Outer {
def member: Inner
/* other methods... */
trait Inner { self: Singleton =>
def parent: Outer.this.type = Outer.this
/* other methods... */
}
}
class OImpl extends Outer {
// Note that OImpl's subclasses can't override member this way
// You could also do private[this] object member0 extends Inner
// and override lazy val member = member0 to restore overridability
// The laziness of object and lazy val mean that member0 won't be created
// if a subclass doesn't use it.
override object member extends Inner {
// ...
}
// ...
}
如何强制 scala 中的特征只能由对象扩展(而不是 classes、特征等)?
我有以下星座:
trait Outer { self: SomeOtherClass =>
def member: Inner.type = Inner
/* some other methods... */
trait Inner { iself =>
def parent: self.type = self
/* other methods... */
}
}
我的问题是:如何强制内部特征必须由对象实现(如 object Inner extends Inner{...})?
我希望每个 class 实现 Outer 的对象都有一个内部对象,它携带一些状态 + 从外部获得内部的可能性,反之亦然。
此致,
约臣
编辑:
示例:
// compiles
class C extends Outer {
object Inner extends Inner { ... }
}
// doesn't compile
class C extends Outer {
class Inner extends Inner { ... }
}
使用 Singleton
自我类型:
trait Outer {
def member: Inner
/* other methods... */
trait Inner { self: Singleton =>
def parent: Outer.this.type = Outer.this
/* other methods... */
}
}
class OImpl extends Outer {
// Note that OImpl's subclasses can't override member this way
// You could also do private[this] object member0 extends Inner
// and override lazy val member = member0 to restore overridability
// The laziness of object and lazy val mean that member0 won't be created
// if a subclass doesn't use it.
override object member extends Inner {
// ...
}
// ...
}