/ / Héritage de la méthode du même nom à partir de traits de différence - java, scala, héritage, traits

Héritage de la méthode du même nom à partir de traits de différence - java, scala, héritage, traits

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 № 1

Dans 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