Выберите определенный суперкласс для вызова метода в Scala - PullRequest
9 голосов
/ 06 ноября 2011

Если у меня есть классовое созвездие в Scala, подобное этому:

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

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

class C extends B {
}

Возможно ли в классе C явно вызвать метод foo, который был определен в A?

Ответы [ 3 ]

18 голосов
/ 07 ноября 2011

Нет, но вы можете сделать нечто похожее с множественным наследованием признаков:

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"
}
8 голосов
/ 06 ноября 2011

Нет, вы не можете, потому что это нарушает инкапсуляцию. Вы обходите поведение своих родителей, поэтому предполагается, что C расширяет B, но вы обходите это.

Пожалуйста, посмотрите на отличный ответ Джона Скитса на тот же вопрос Почему это super.super.method (); не разрешено в Java? .

Обратите внимание, что вы можете получить доступ к полю с помощью отражения, но вы не хотите этого делать.

2 голосов
/ 06 ноября 2011

Нет.И я бы оставил это на этом, но, очевидно, ТАК хочет, чтобы я продолжал набирать 30 символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...