Kotlin
Eredità di classe
Ricerca…
introduzione
Qualsiasi linguaggio di programmazione orientato agli oggetti ha una qualche forma di ereditarietà di classe. Fammi rivedere:
Immagina di dover programmare un mucchio di frutta: Apples
, Oranges
e Pears
. Differiscono per dimensioni, forma e colore, ecco perché abbiamo classi diverse.
Ma diciamo che le loro differenze non contano per un secondo e tu vuoi solo un Fruit
, non importa quale sia esattamente? Quale tipo di getFruit()
avrebbe getFruit()
?
La risposta è classe Fruit
. Creiamo una nuova classe e ne ereditiamo tutti i frutti!
Sintassi
- apri {Base Class}
- class {Derived Class}: {Base Class} ({Init Arguments})
- override {Definizione funzione}
- {DC-Object} è {Base Class} == true
Parametri
Parametro | Dettagli |
---|---|
Classe Base | Classe ereditata da |
Classe derivata | Classe che eredita dalla classe base |
Argomenti di init | Argomenti passati al costruttore di Base Class |
Definizione della funzione | Funzione nella classe derivata con codice diverso da quello della classe base |
DC-Object | Oggetto "Derivato oggetto di classe" con il tipo di Classe derivata |
Nozioni di base: la parola chiave 'aperta'
In Kotlin, le classi sono definitive di default, il che significa che non possono essere ereditate da.
Per consentire l'ereditarietà su una classe, usa la parola chiave open
.
open class Thing {
// I can now be extended!
}
Nota: le classi astratte, le classi sigillate e le interfacce saranno
open
per impostazione predefinita.
Ereditare i campi da una classe
Definire la classe base:
open class BaseClass {
val x = 10
}
Definizione della classe derivata:
class DerivedClass: BaseClass() {
fun foo() {
println("x is equal to " + x)
}
}
Utilizzando la sottoclasse:
fun main(args: Array<String>) {
val derivedClass = DerivedClass()
derivedClass.foo() // prints: 'x is equal to 10'
}
Ereditare metodi da una classe
Definire la classe base:
open class Person {
fun jump() {
println("Jumping...")
}
}
Definizione della classe derivata:
class Ninja: Person() {
fun sneak() {
println("Sneaking around...")
}
}
Il Ninja ha accesso a tutti i metodi in Persona
fun main(args: Array<String>) {
val ninja = Ninja()
ninja.jump() // prints: 'Jumping...'
ninja.sneak() // prints: 'Sneaking around...'
}
Sovrascrittura di proprietà e metodi
Proprietà di override (sia di sola lettura che mutabili):
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
}
Metodi di sovrascrittura:
interface Ship {
fun sail()
fun sink()
}
object Titanic : Ship {
var canSail = true
override fun sail() {
sink()
}
override fun sink() {
canSail = false
}
}