【问题标题】:Is it possible to access anonymous outer classes?是否可以访问匿名外部类?
【发布时间】:2017-07-21 16:02:54
【问题描述】:

简单的方法是在外部类主体中指定this 声明,以定义每个类的唯一名称。但我想在不修改外部类的情况下编写访问权限。

代码示例:

trait Test {
  def z = new Test {
    val a = 1
    def y = new Test {
      val a = false
      def x = new Test {
        val b = 2 * a
      }
    }
  }
}

在定义val b 时,我想访问outer.outer.a 而不仅仅是outer.a

如何指定匿名类的this?如果是Named,我可以写Named.this,但是匿名类没有名字。

【问题讨论】:

    标签: scala class inner-classes


    【解决方案1】:

    这可以通过self types实现:

    trait Test { greatGrandparent =>
      def z = new Test { grandparent =>
        val a = 1
        def y = new Test { parent =>
          val a = false
          def x = new Test {
            val b = 2 * grandparent.a
          }
        }
      }
    }
    

    【讨论】:

    • 我无法修改父类,它们是给定的。我无法从符号中读取自我引用,因为它已经被删除了。因此问题是:如何在不依赖自类型特征的情况下引用父类,正如我在第一个问题摘要中提到的那样
    • greatGrandparent的引用是唯一调整父类的地方。我想我对这个问题理解得不够透彻——对于grandParentparent,self 类型应该没问题。
    • 你不能修改外部类,不能给它们添加自我类型。他们可能已经有被方法中的变量遮蔽的自引用。我需要一种可靠的方式来推荐曾祖父母,而无需做出任何额外的假设,例如自我参考可用性