【问题标题】:How to reference outer object from inner class in Scala如何在Scala中从内部类引用外部对象
【发布时间】:2014-09-28 17:35:21
【问题描述】:

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

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)
}

为了使整个工作正常,我需要调用外部对象的apply 方法来实现继承(在上面的代码中标记为POINT_OF_INTEREST)。考虑到这一点,我敢于问几个问题:

  1. 有什么办法吗?
  2. 如果有很多,每个的优缺点是什么?
  3. 如果您认为整个事情都是错误的,那么您实现此类功能的正确方法是什么?

【问题讨论】:

    标签: scala inheritance inner-classes abstract-type


    【解决方案1】:

    就像 Java,

    class Foo {
      val foot = 0
      class Bar {
        val bart = Foo.this.foot
      }
    }
    

    或以 Scala 方式,

    class Foo { self =>
      val foot = 0
      class Bar {
        val bart = self.foot
      }
    }
    

    【讨论】:

      【解决方案2】:

      使用自我参考:

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

      请参阅 SO Scala 教程的 17. Self references 章节,了解有关此构造还允许您做什么的更多信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        相关资源
        最近更新 更多