【问题标题】:How to access "overridden" inner class in Scala?如何访问 Scala 中的“覆盖”内部类?
【发布时间】:2011-01-27 01:13:58
【问题描述】:

我有两个特性,一个扩展另一个,每个都有一个内部类,一个扩展另一个,具有相同的名称:

trait A {
    class X {
        def x() = doSomething()
    }
}

trait B extends A {
    class X extends super.X {
        override def x() = doSomethingElse()
    }
}

class C extends B {
    val x = new X() // here B.X is instantiated
    val y = new A.X() // does not compile
    val z = new A.this.X() // does not compile
}

如何在C 类的主体中访问A.X 类?重命名 B.X 而不隐藏 A.X 不是首选方式。

为了让事情有点复杂,在我遇到这个问题的情况下,特征具有类型参数(本示例中未显示)。

【问题讨论】:

    标签: scala overriding hidden inner-classes


    【解决方案1】:
    trait A {
        class X {
            def x() = "A.X"
        }
    }
    
    trait B extends A {
        class X extends super.X {
            override def x() = "B.X"
        }
    }
    
    class C extends B {
      val self = this:A
      val x = new this.X()
      val y = new self.X()
    }
    
    scala> val c = new C
    c: C = C@1ef4b
    
    scala> c.x.x 
    res0: java.lang.String = B.X
    
    scala> c.y.x
    res1: java.lang.String = A.X
    

    【讨论】:

    • 非常感谢,我不记得在 Odersky 的 Programming in Scala 书中遇到过这种语法。我承认这个案子很前卫:)
    【解决方案2】:

    对于那些对这个奇异问题感兴趣的人,我发现它也可以作为函数的返回值。由于我的特征 A 和 B 有类型参数,它应该导致更简洁的代码:

    trait A[T, U, V] {
        class X {
            def x() = "A.X"
        }
    
        def a = this:A[T, U, V]
    }
    
    trait B[T, U, V] extends A[T, U, V] {
        class X extends super.X {
            override def x() = "B.X"
        }
    }
    
    class C extends B[SomeClass, SomeOtherClass, ThirdOne] {
        val aVerbose = this:A[SomeClass, SomeOtherClass, ThirdOne] // works but is a bit ugly
        val aConcise = a
        val x = new this.X()
        val y = new aVerbose.X()
        val z = new aConcise.X()
    }
    
    scala> val c = new C()
    c: C = C@1e852be
    
    scala> c.x.x()
    res2: java.lang.String = B.X
    
    scala> c.y.x()
    res3: java.lang.String = A.X
    
    scala> c.z.x()
    res4: java.lang.String = A.X
    

    【讨论】:

      猜你喜欢
      • 2013-11-09
      • 2018-04-25
      • 1970-01-01
      • 2013-10-21
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多