如何在Scala中引用内部类的外部对象

Art*_*ykh 3 inheritance scala inner-classes abstract-type

考虑这段代码(这是一种类型安全的单位):

abstract class UnitsZone {
   type ConcreteUnit <: AbstractUnit

   abstract class AbstractUnit(val qty: Int) {
     SOME_ABSTRACT_MEMBERS
     def +(that: ConcreteUnit): ConcreteUnit = POINT_OF_INTEREST.apply(this.qty + that.qty)
     def apply(param: Int) = SOME_IMPLEMENTATION
   }

   def apply(qty: Int): ConcreteUnit
}

object Imperial extends UnitsZone {
  type ConcreteUnit = Pound

  class Pound(override val qty: Int) extends AbstractUnit(qty) {
    CONCRETE_MEMBERS_HERE
  }

  def apply(qty: Int) = new Pound(qty)
}
Run Code Online (Sandbox Code Playgroud)

为了使整个事情有效,我需要调用apply外部对象的继承方法(在上面的代码中标记为POINT_OF_INTEREST).考虑到这一点,我敢问几个问题:

  1. 有什么办法吗?
  2. 如果有很多,每个人的利弊是什么?
  3. 如果您认为整件事情是错误的,那么您实施此类功能的正确方法是什么?

kir*_*uku 8

使用自我参考:

abstract class UnitsZone {
  outer =>
  type ConcreteUnit <: AbstractUnit
  ...
  abstract class AbstractUnit(val qty: Int) {
    def +(that: ConcreteUnit): ConcreteUnit = outer.apply(this.qty + that.qty)
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

有关此构造允许您执行的其他操作的更多信息,请参见第17章SO Scala教程的自我引用.