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 {
}
3 Réponses :
non. Et je le laisserais à cela, mais apparemment, alors je veux que je continue de 30 caractères. P>
Si vous connaissez la raison pour laquelle cela n'est pas possible, cela pourrait être quelque chose à remplir les 30 caractères :)
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. P>
S'il vous plaît voir Jon Skeets Excellente réponse à la même question Pourquoi est super.super.method (); Non autorisé dans Java? . P>
Veuillez noter que vous pouvez accéder au champ par réflexion, mais vous ne voulez pas faire cela. P>
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"
}
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 code> étend explicitement a code>, donc il reçoit un accès direct un comportement code>. Pour être honnête, cet exemple semble étrange et je ne suis pas sûr que ce soit bon style.