强制特征由对象实现

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 {
    // ...
  }
  // ...
}