Kotlin
Klassenvererbung
Suche…
Einführung
Jede objektorientierte Programmiersprache hat irgendeine Form der Klassenvererbung. Lass mich überarbeiten:
Stellen Sie sich vor, Sie müssten einen Haufen Obst programmieren: Apples
, Oranges
und Pears
. Sie unterscheiden sich alle in Größe, Form und Farbe, deshalb haben wir unterschiedliche Klassen.
Aber lassen Sie uns sagen, dass ihre Unterschiede für eine Sekunde keine Rolle spielen und Sie wollen einfach nur eine Fruit
, egal welche genau? Welchen Rückgabetyp hätte getFruit()
?
Die Antwort ist Klasse Fruit
. Wir erstellen eine neue Klasse und lassen alle Früchte davon erben!
Syntax
- offen {Basisklasse}
- Klasse {Abgeleitete Klasse}: {Basisklasse} ({Init-Argumente})
- überschreiben {Funktionsdefinition}
- {DC-Object} ist {Base Class} == wahr
Parameter
Parameter | Einzelheiten |
---|---|
Basisklasse | Klasse, von der vererbt wird |
Abgeleitete Klasse | Klasse, die von der Basisklasse erbt |
Init-Argumente | An den Konstruktor der Basisklasse übergebene Argumente |
Funktionsdefinition | Funktion in abgeleiteter Klasse, deren Code sich von der Basisklasse unterscheidet |
DC-Objekt | "Abgeleitetes Klassenobjekt" Objekt, das den Typ der abgeleiteten Klasse hat |
Grundlagen: das Schlüsselwort 'open'
In Kotlin sind Klassen standardmäßig final, dh sie können nicht von übernommen werden.
Um die Vererbung einer Klasse zuzulassen, verwenden Sie das Schlüsselwort open
.
open class Thing {
// I can now be extended!
}
Hinweis: Abstrakte Klassen, versiegelte Klassen und Schnittstellen sind standardmäßig
open
.
Felder von einer Klasse übernehmen
Definieren der Basisklasse:
open class BaseClass {
val x = 10
}
Definieren der abgeleiteten Klasse:
class DerivedClass: BaseClass() {
fun foo() {
println("x is equal to " + x)
}
}
Verwendung der Unterklasse:
fun main(args: Array<String>) {
val derivedClass = DerivedClass()
derivedClass.foo() // prints: 'x is equal to 10'
}
Methoden von einer Klasse übernehmen
Definieren der Basisklasse:
open class Person {
fun jump() {
println("Jumping...")
}
}
Definieren der abgeleiteten Klasse:
class Ninja: Person() {
fun sneak() {
println("Sneaking around...")
}
}
Der Ninja hat Zugriff auf alle Methoden in Person
fun main(args: Array<String>) {
val ninja = Ninja()
ninja.jump() // prints: 'Jumping...'
ninja.sneak() // prints: 'Sneaking around...'
}
Eigenschaften und Methoden überschreiben
Überschreibende Eigenschaften (sowohl schreibgeschützt als auch veränderbar):
abstract class Car {
abstract val name: String;
open var speed: Int = 0;
}
class BrokenCar(override val name: String) : Car() {
override var speed: Int
get() = 0
set(value) {
throw UnsupportedOperationException("The car is bloken")
}
}
fun main(args: Array<String>) {
val car: Car = BrokenCar("Lada")
car.speed = 10
}
Überschreibende Methoden:
interface Ship {
fun sail()
fun sink()
}
object Titanic : Ship {
var canSail = true
override fun sail() {
sink()
}
override fun sink() {
canSail = false
}
}