Erstens hat die Vererbung als Prämisse die folgenden Zwecke. (Referenz: http://equj65.net/tech/java8mixin/)
Die tatsächlichen Vererbungsmuster sind die folgenden zwei Muster.
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 _)
Es bedeutet wörtlich, von mehreren Klassen zu erben.
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).
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.
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.
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.
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