9
votes

Sélectionnez certaines superques pour appeler la méthode dans Scala

Si j'ai une constellation de classe dans Scala, comme ceci:

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

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

class C extends B {
}


0 commentaires

3 Réponses :


2
votes

non. Et je le laisserais à cela, mais apparemment, alors je veux que je continue de 30 caractères.


1 commentaires

Si vous connaissez la raison pour laquelle cela n'est pas possible, cela pourrait être quelque chose à remplir les 30 caractères :)



8
votes

Non, vous ne pouvez pas, car il viole l'encapsulation. Vous contournez le comportement de vos parents, donc C est censé prolonger B, mais vous ignorez cela.

S'il vous plaît voir Jon Skeets Excellente réponse à la même question Pourquoi est super.super.method (); Non autorisé dans Java? .

Veuillez noter que vous pouvez accéder au champ par réflexion, mais vous ne voulez pas faire cela.


0 commentaires

18
votes

Non, mais vous pouvez faire quelque chose de similaire avec plusieurs traitements de trait:

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


2 commentaires

Et pourquoi cela ne casse-t-il pas l'encapsulation alors que @Matthew a dit dans sa réponse?


Dans cet exemple, la classe C étend explicitement a , donc il reçoit un accès direct un comportement . Pour être honnête, cet exemple semble étrange et je ne suis pas sûr que ce soit bon style.