[JAVA] Remarques sur l'héritage multiple

Qu'est-ce que l'héritage multiple en premier lieu?

Qu'est-ce que l'héritage?

Premièrement, en tant que prémisse, l'héritage a les objectifs suivants. (Référence: http://equj65.net/tech/java8mixin/)

  1. Héritage d'implémentation (réutilisation)
  2. Héritage de spécification (spécifie explicitement que la classe héritée a une méthode, c'est-à-dire que du côté client, il est garanti qu'une méthode est toujours implémentée)

Les modèles d'héritage réels sont les deux modèles suivants.

  1. Hériter à la fois des spécifications et de la mise en œuvre
  2. Héritez uniquement les spécifications.

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 _)

Qu'est-ce que l'héritage multiple?

Cela signifie littéralement hériter de plusieurs classes.

Quel est le problème?

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).

Pour obtenir un héritage multiple

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.

Considération

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.

  1. Vous pouvez forcer l'auteur de la classe à implémenter
  2. Comme on suppose que le côté client a une implémentation, il n'est pas nécessaire de penser à une gestion des erreurs supplémentaire.
  3. Une vérification de type peut être effectuée, de sorte qu'un développement plus fiable peut être effectué.

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.

référence

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

Remarques sur l'héritage multiple
Remarques sur les tampons de protocole
mémo python sur docker
[Android] Notes sur xml
Notes sur les expressions régulières
[Ruby] Notes sur la méthode gets
Héritage
Héritage
Remarques sur le contrôle du signal en Java
Remarques sur l'appel du programme d'installation sur l'application Android
Remarques sur la migration de CircleCI 1.0 vers 2.0
Remarques sur le traitement des threads Android (java)
Remarques sur le chemin et le package Java
Remarques sur l'utilisation des fichiers de propriétés encodés en UTF-8
Lancez plusieurs instances Redmine sur un serveur
Remarques sur les opérateurs utilisant Java ~ Type chaîne ~
Remarques sur expand () et collapse () de Expandablerecyclerview
Remarques sur la création d'un plug-in Android pour Unity
Remarques sur l'utilisation de FCM avec Ruby on Rails
Remarques sur l'API Stream et SQL de Java
Remarques sur les balises d'extension JSP dans SpringFrameWork
Ouvrez plusieurs espaces de travail dans Eclipse sur Mac