Premièrement, en tant que prémisse, l'héritage a les objectifs suivants. (Référence: http://equj65.net/tech/java8mixin/)
Les modèles d'héritage réels sont les deux modèles suivants.
Héritage des spécifications et mise en œuvre.kt
open class Person {
fun greet() { System.out.print("Bonjour") }
}
class Japanese: Person{ }
fun main(args: Array<String>) {
val taro = Japanese()
taro.greet()
}
Hériter uniquement des spécifications.kt
interface Person {
fun greet()
}
class Japanese: Person{
override fun greet() { System.out.print("Bonjour") }
}
fun main(args: Array<String>) {
val taro = Japanese()
taro.greet()
}
Comme mentionné ci-dessus, si vous n'héritez que des spécifications, vous héritez de l'interface. En effet, l'interface ne peut pas contenir d'implémentation. (Il semble que vous puissiez avoir une implémentation dans _Java8, mais je n'y toucherai pas ici _)
Cela signifie littéralement hériter de plusieurs classes.
Il existe un phénomène appelé le problème du diamant. Regardez le code ci-dessous.
diamondProblem (si l'héritage multiple d'implémentation est possible).kt
interface Person {
fun greet()
}
open class Japanese: Person {
override fun greet() { System.out.print("Bonjour") }
}
class American: Person {
override fun greet() { System.out.print("Hello") }
}
//Si un tel héritage multiple est possible
class Half: Japanese(), American { }
fun main(args: Array<String>) {
val karl = Half()
karl.greet()
}
Quel genre de salutation fait vraiment Karl? Il s'agit en fait d'une erreur de compilation. C'est parce que Java ne peut pas avoir plusieurs classes parentes.
Pourquoi ne puis-je pas avoir plusieurs cours pour parents? Prenons le cas où la classe parent héritée (japonaise, américaine) implémente une méthode portant le même nom que dans l'exemple ci-dessus. Le compilateur ne peut pas résoudre quelle méthode est appelée lorsque la méthode greet est appelée à partir de la classe héritée (Half).
Par conséquent, pour des raisons de compilation, Java ne peut pas hériter de plusieurs classes (! = Interface).
Il hérite de l'interface au lieu d'hériter de la classe d'implémentation. Cependant, dans ce cas, vous devez écrire l'implémentation dans la classe héritée. Par conséquent, l'implémentation ne peut pas être réutilisée et seules les spécifications peuvent être héritées.
L'héritage des spécifications semble être similaire à Duck Typing in Ruby. Cependant, je pense que l'héritage des spécifications est supérieur dans les points suivants.
L'héritage d'implémentation semble être similaire à Mix-in dans Ruby. Cependant, Mix-in est plus facile à utiliser car il ne complique pas la structure d'héritage.
http://equj65.net/tech/java8mixin/ https://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html https://en.wikipedia.org/wiki/Multiple_inheritance https://en.wikipedia.org/wiki/Mixin
Recommended Posts