1.1.50.7. fejezet, Öröklődés
Nincs többszörös öröklődés, egy osztálynak csak egy őse lehet. Ős nélküli osztály implicit öröklődik az Any osztályból. Alapértelmezetten a kotlin osztály végleges, nem öröklődhet belőle semmilyen osztály, kivéve ha open kulcsszóval jelöljük meg.
open class Base(p: Int) class Derived(p: Int) : Base(p)
Ha a leszármazott osztálynak nincs alapértelmezett konstruktora, a super kulcsszóval kell meghívni az ősosztály megfelelő konstruktorát.
class MyView : View { constructor(ctx: Context) : super(ctx) constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) }
Metódus felülrás
open class Shape { open fun draw() { /*...*/ } fun fill() { /*...*/ } } class Circle() : Shape() { override fun draw() { /*...*/ } }
A már override-al megjelölt metódusok open-ek is egyben, az újabb leszármaztatott osztályban ugyanúgy fellülírhatóak.
Tulajdonság felülírás
open class Shape { open val vertexCount: Int = 0 } class Rectangle : Shape() { override val vertexCount = 4 }
A val tulajdonságok felülírhatók var tulajdonságokkal, mert a val-nak van get-tere, a var-nak ezen felül van set-tere is. Elsődleges konstruktorban is alkalmazható a felülírás:
interface Shape { val vertexCount: Int }
Inicializálási sorrend
open class Base(val name: String) { init { println("Initializing a base class") } open val size: Int = name.length.also { println("Initializing size in the base class: $it") } } class Derived( name: String, val lastName: String, ) : Base(name.replaceFirstChar { it.uppercase() }.also { println("Argument for the base class: $it") }) { init { println("Initializing a derived class") } override val size: Int = (super.size + lastName.length).also { println("Initializing size in the derived class: $it") } } fun main() { println("Constructing the derived class(\"hello\", \"world\")") Derived("hello", "world") } class Rectangle(override val vertexCount: Int = 4) : Shape // Always has 4 vertices class Polygon : Shape { override var vertexCount: Int = 0 // Can be set to any number later }
Eredménye:
Constructing the derived class("hello", "world") Argument for the base class: Hello Initializing a base class Initializing size in the base class: 5 Initializing a derived class Initializing size in the derived class: 10
Ősosztály metódus hívása
open class Rectangle { open fun draw() { println("Drawing a rectangle") } val borderColor: String get() = "black" } class FilledRectangle : Rectangle() { override fun draw() { super.draw() println("Filling the rectangle") } val fillColor: String get() = super.borderColor }
Ha egy inner classnak megadjuk melyik külső osztályt hívjuk, akkor használjuk a super@osztálynév formát:
class FilledRectangle: Rectangle() { override fun draw() { val filler = Filler() filler.drawAndFill() } inner class Filler { fun fill() { println("Filling") } fun drawAndFill() { super@FilledRectangle.draw() // Calls Rectangle's implementation of draw() fill() println("Drawn a filled rectangle with color ${super@FilledRectangle.borderColor}") // Uses Rectangle's implementation of borderColor's get() } } }
Felülírási szabályok
open class Rectangle { open fun draw() { /* ... */ } } interface Polygon { fun draw() { /* ... */ } // interface members are 'open' by default } class Square() : Rectangle(), Polygon { // The compiler requires draw() to be overridden: final override fun draw() { // descendant can't override now super<Rectangle>.draw() // call to Rectangle.draw() super<Polygon>.draw() // call to Polygon.draw() } }
Típus kényszerítés (type cast)
var car: Vehicle = ElectricalCar("Toyota") println(car) (car as Car).load()
- A hozzászóláshoz be kell jelentkezni