在Scala中为方法调用选择某个超类

ars*_*bon 9 scala

如果我在Scala中有类星座,就像这样:

class A {
def foo() = "bar"
}

class B extends A {
override def foo() = "BAR"
}

class C extends B {
}
Run Code Online (Sandbox Code Playgroud)

是否有可能在C类中显式调用A中定义的方法foo?

Kip*_*ros 18

不,但您可以使用多个特征继承做类似的事情:

trait A { def foo = "from A" }

class B extends A { override def foo = "from B" }

class C extends B with A {
  val b = foo          // "from B"
  val a = super[A].foo // "from A"
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*ell 8

不,你不能,因为它违反了封装.你绕过了父母的行为,所以C应该扩展B,但你绕过了这个.

请看Jon Skeets对同一问题的出色答案为什么super.super.method(); Java不允许?.

请注意,您可以通过反射访问该字段,但您不希望这样做.