[JAVA] Hinweise zur Mehrfachvererbung

Was ist überhaupt Mehrfachvererbung?

Was ist Vererbung?

Erstens hat die Vererbung als Prämisse die folgenden Zwecke. (Referenz: http://equj65.net/tech/java8mixin/)

  1. Implementierungsvererbung (Wiederverwendung)
  2. Spezifikationsvererbung (gibt explizit an, dass die geerbte Klasse eine Methode hat, dh von der Clientseite wird garantiert, dass eine Methode immer implementiert ist)

Die tatsächlichen Vererbungsmuster sind die folgenden zwei Muster.

  1. Erben Sie sowohl die Spezifikationen als auch die Implementierung
  2. Erben Sie nur die Spezifikationen.

Vererbung von Spezifikationen und Implementierung.kt


open class Person {
    fun greet() { System.out.print("Hallo") }
}

class Japanese: Person{ }

fun main(args: Array<String>) {
    val taro = Japanese()
    taro.greet()
}

Erben Sie nur Spezifikationen.kt


interface Person {
    fun greet()
}

class Japanese: Person{ 
    override fun greet() { System.out.print("Hallo") }
}

fun main(args: Array<String>) {
    val taro = Japanese()
    taro.greet()
}

Wie oben erwähnt, erben Sie die Schnittstelle, wenn Sie nur die Spezifikationen erben. Dies liegt daran, dass die Schnittstelle keine Implementierung enthalten kann. (Es scheint, dass Sie eine Implementierung in _Java8 haben können, aber ich werde es hier nicht berühren _)

Was ist Mehrfachvererbung?

Es bedeutet wörtlich, von mehreren Klassen zu erben.

Was ist das Problem?

Es gibt ein Phänomen, das als Diamantproblem bezeichnet wird. Schauen Sie sich den Code unten an.

diamantProblem (wenn eine mehrfache Vererbung der Implementierung möglich ist).kt


interface Person {
    fun greet()
}

open class Japanese: Person {
    override fun greet() { System.out.print("Hallo") }
}

class American: Person {
    override fun greet() { System.out.print("Hello") }
}

//Wenn eine solche Mehrfachvererbung möglich ist
class Half: Japanese(), American { }

fun main(args: Array<String>) {
    val karl = Half()
    karl.greet()
}

Was für eine Begrüßung macht Karl wirklich? Dies ist eigentlich ein Kompilierungsfehler. Dies liegt daran, dass Java nicht mehrere übergeordnete Klassen haben kann.

Warum kann ich nicht mehrere Elternklassen haben? Stellen Sie sich den Fall vor, in dem die geerbte übergeordnete Klasse (Japanisch, Amerikanisch) die Methode mit demselben Namen wie im obigen Beispiel implementiert. Der Compiler kann nicht auflösen, welche Methode aufgerufen wird, wenn die Greet-Methode von der geerbten Klasse (Half) aufgerufen wird.

Aus Compilergründen kann Java daher nicht mehrere Klassen erben (! = Schnittstelle).

Mehrfachvererbung erreichen

Schnittstelle erben, anstatt die Implementierungsklasse zu erben. In diesem Fall müssen Sie die Implementierung jedoch in die geerbte Klasse schreiben. Daher kann die Implementierung nicht wiederverwendet werden und nur die Spezifikationen können vererbt werden.

Erwägung

Die Vererbung von Spezifikationen scheint der Ententypisierung in Ruby ähnlich zu sein. Ich denke jedoch, dass die Vererbung von Spezifikationen in den folgenden Punkten überlegen ist.

  1. Sie können den Klassenautor zur Implementierung zwingen
  2. Da davon ausgegangen wird, dass die Clientseite über eine Implementierung verfügt, müssen Sie nicht über eine zusätzliche Fehlerbehandlung nachdenken.
  3. Die Typprüfung kann durchgeführt werden, sodass eine zuverlässigere Entwicklung durchgeführt werden kann.

Die Vererbung der Implementierung scheint dem Mix-In in Ruby ähnlich zu sein. Mix-In ist jedoch einfacher zu verwenden, da es die Vererbungsstruktur nicht kompliziert.

Referenz

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

Hinweise zur Mehrfachvererbung
Hinweise zu Protokollpuffern
Python-Memo auf Docker
[Android] Hinweise zu XML
Hinweise zu regulären Ausdrücken
[Ruby] Hinweise zur Methode gets
Erbe
Erbe
Hinweise zur Signalsteuerung in Java
Hinweise zum Aufrufen von Installer in der Android App
Hinweise zur Migration von CircleCI 1.0 auf 2.0
Hinweise zum Java-Pfad und -Paket
Hinweise zum Arbeiten mit UTF-8-codierten Eigenschaftendateien
Starten Sie mehrere Redmine-Instanzen auf einem Server
Hinweise zu Operatoren, die Java ~ String type ~ verwenden
Hinweise zum Erweitern () und Reduzieren () von Expandablerecyclerview
Hinweise zum Erstellen eines Android-Plug-Ins für Unity
Hinweise zur Verwendung von FCM mit Ruby on Rails
Hinweise zur Stream-API und zu SQL von Java
Hinweise zu JSP-Erweiterungs-Tags in SpringFrameWork
Öffnen Sie mehrere Arbeitsbereiche in Eclipse auf dem Mac