J'ai un trait qui étend deux autres traits qui ont le même nom pour une fonction mais c'est un peu différent de l'intérieur, je veux savoir comment je sais quelle fonction sera invoquée?
J'ai trait B
qui a print()
et trait C
qui a print()
, si j’en hérite tous les deux comme ceci:
trait A extends B with C {
def print()
}
chaque impression imprimer quelque chose d'autre, quelle impression sera invoquée?
Réponses:
6 pour la réponse № 1Dans le cas particulier où vous avez des conflits de noms, vous recevrez une erreur lors de la compilation. D
est la classe d'implémentation:
class D extends A with C with B
def main(args: Array[String]): Unit = {
val d = new D
println(d.print())
}
Tu verras:
Error:(25, 9) class D inherits conflicting members:
method print in trait B of type ()Unit and
method print in trait C of type ()Unit
(Note: this can be resolved by declaring an override in class D.)
class D extends A with B with C
Cependant, si nous aidons le compilateur en ajoutant un override print()
à D
, et le faire appeler super.print()
, il imprimera le dernier trait de la lignée qui supporte un print
méthode, à savoir:
trait A { }
trait B { def print() = println("hello") }
trait C { def print() = println("world") }
class D extends A with B with C {
override def print(): Unit = super.print()
}
Nous "obtiendrons" le monde ". Si nous passions B
et C
:
class D extends A with C with B {
override def print(): Unit = super.print()
}
Nous "aurions" bonjour ".
1 pour la réponse № 2
L’une des caractéristiques les plus importantes de Traits dansLe papier original de Schärli, Ducassé, Nierstrasz, Black est la résolution de conflits via le changement de nom et le masquage. Cette fonctionnalité est complètement absente des traits de Scala.
En Scala, les conflits ne sont tout simplement pas autorisés. Ils sont détectés et rejetés par le système de types. (Le document original était dans le contexte de Smalltalk, qui n’a pas de système de type, une approche différente a donc été utilisée.)
0 pour la réponse № 3
Le compilateur Scala vous donne une erreur de compilation.
Pourquoi ne le voyez-vous pas vous-même avec Scala REPL.
scala> trait B { def print(): Unit = println("B") }
defined trait B
scala> trait C { def print(): Unit = println("C") }
defined trait C
scala> trait A extends B with C { def foo = print() }
cmd11.sc:1: trait A inherits conflicting members:
method print in trait B of type ()Unit and
method print in trait C of type ()Unit
(Note: this can be resolved by declaring an override in trait A.)
trait A extends B with C { def foo = print() }
^
Compilation Failed
Je pense que vous pouvez facilement comprendre en utilisant l'erreur du compilateur