J'ai du mal à comprendre le résultat de mon programme. Je ne suis pas sûr de savoir pourquoi je reçois le résultat que je fais. Voici les classes / traits impliqués
class SuperClass {
def superMethodFromClass() = {println("from super class")};
}
trait SuperTrait extends SuperClass{
def superMethod():Unit={}
override def superMethodFromClass() = {println("from super trait")};
}
class TestClass extends SuperClass with SuperTrait{
def callSMFC() = superMethodFromClass()
}
Lorsque j'utilise le code suivant dans la méthode principale: -
val testClass = new TestClass
testClass.callSMFC
il imprime "de super trait"
Quelqu'un peut-il s'il vous plaît expliquer pourquoi cela se produit ???
Merci,
Amar
Réponses:
0 pour la réponse № 1Le compilateur scala utilise la linéarisation pour combiner (plusieurs traits) en classes.
Vous pouvez voir votre exemple de plusieurs choses empilées les unes sur les autres. Votre TestClass
hérite de SuperClass
et alors SuperTrait
est empilé sur le dessus.
En appelant superMethodFromClass()
, le premier endroit à rechercher une implémentation est le TestClass
lui-même cependant TestClass
n'a pas remplacé la méthode, le compilateur va chercher en premier dans SuperTrait
donc tu vois que "from super trait"
est imprimé.
Pour plus de détails, consultez le lien ci-dessous concernant le modèle de trait empilable. https://code.sahebmotiani.com/patterns-in-scala-101-5d0fa70aaf3f