Ce n'est pas une grande question, c'est plutôt mon excitation que c'est possible du tout! J'ai écrit ce petit exemple pour prouver le contraire - je m'attendais à une erreur de compilateur ou à l'une des valeurs (111 ou 222, je n'étais pas sûr). Pourquoi v code> est remplacé? Bien sûr, cela ne fonctionne que tant que
v code> s sont privés, mais toujours. P> p>
3 Réponses :
Les membres privés et les méthodes ne peuvent pas être remplacés. Il est d'empêcher les changements de comportement de classe injectés par des descendants. Le concept ici est très similaire à C ++ un - chaque ancêtre détient sa propre copie de membres jusqu'à ce qu'une méthode spéciale (héritage virtuel, par exemple) soit invoquée. P>
Étant donné que les traits ne sont pas seulement des interfaces, ils ont besoin d'un moyen de stocker leur état interne. Mais ils doivent être compatibles avec des interfaces - alors que font-ils? Ils créent des accesseurs pour ce qui ressemble à un champ (comme vous pouvez le voir (entre autres (entre autres) avec puis créez une classe de mise en œuvre contenant des méthodes statiques pour implémenter la fonctionnalité: p> maintenant, espérons-le, il est clair que ceux-ci seraient distincts par défaut puisque ces Les méthodes générées ont le nom du trait au nom de la méthode em>. Et lorsque nous examinons la mise en œuvre dans Vous pouvez voir qu'il remplit simplement ce qui est nécessaire pour chaque trait spécifique. Maintenant, la question est - comment les traits jamais em> écrasent mutuellement? Ils semblent être complètement séparés! C'est le travail du compilateur. Si quelque chose est Parce que maintenant, il n'utilise pas les noms secrètes mutilés avec le nom de trait incorporé. (Observez que javap -l -s -c -c -private code> sur les fichiers de classe):
T12 code>: p>
privé code> c'est caché et ne peut pas être remplacé, donc peu importe qu'une autre chose (privée) a le même nom. Mais si ce n'est pas le cas, le compilateur se plaint d'une collision: p>
getvaluet1 code> n'est pas géré dans cet exemple.) P> p>
Bonne réponse. Une légère correction - t1 $ classe code> s'appelle la classe de mise en œuvre.
En effet - une classe d'accompagnement est autre chose. Fixé.
Ce n'est pas une propriété particulière aux traits. Par exemple:
scala> class X { | private val v = 111 | def getX = v | } defined class X scala> class Y extends X { | private val v = 222 | def getY = v | } defined class Y scala> new Y res0: Y = Y@5ca801b0 scala> res0.getX res1: Int = 111 scala> res0.getY res2: Int = 222
Maintenant, je suis un peu gêné d'être tellement excitée d'une telle chose triviale :) Je suppose que je venais de trop se concentrer sur les traits de voir la photo plus large.
@Vilius Eh bien, il regarde i> trivial du côté Scala. Quand l'un vient de Java, qui est si plein de limitations, il a l'air spécial.