Junior
Πώς λειτουργεί η κληρονομιά στο Kotlin;
sobes.tech AI
Απάντηση από AI
Η κληρονομικότητα στο Kotlin βασίζεται στην αρχή των ανοιχτών κλάσεων. Από προεπιλογή, όλες οι κλάσεις είναι κλειστές (final), και για να κάνετε μια κλάση κληρονομήσιμη, πρέπει να την επισημάνετε ρητά με τη λέξη-κλειδί open.
Βασικά σημεία:
- Ανοιχτές κλάσεις: Η βασική κλάση πρέπει να επισημανθεί ως
open.open class Base { // ... } - Κληρονομικότητα: Η κληρονομικότητα πραγματοποιείται με τη χρήση δύο τελειών (
:), ακολουθούμενη από το όνομα της βασικής κλάσης και, αν χρειάζεται, την κλήση του κατασκευαστή της.class Derived : Base() { // ... } - Υπερκαλύψεις μεθόδων και ιδιοτήτων: Για να υπερκαλύψετε μεθόδους ή ιδιότητες της βασικής κλάσης, αυτές πρέπει να είναι επισημασμένες ως
openστη βασική κλάση, και στη δομημένη κλάση χρησιμοποιείται η λέξη-κλειδίoverride.Αν η μέθοδος ή η ιδιότητα της βασικής κλάσης δεν είναι επισημασμένη ωςopen class Base { open fun process() { /* ... */ } open val value: Int = 0 } class Derived : Base() { override fun process() { /* ... */ } override val value: Int = 1 }open, δεν μπορεί να υπερκαλυφθεί. - Πρόσβαση σε μέλη της βασικής κλάσης: Η πρόσβαση σε μέλη της βασικής κλάσης από την δομημένη κλάση γίνεται με τη χρήση της λέξης-κλειδί
super.class Derived : Base() { override fun process() { super.process() // Κλήση της μεθόδου της βασικής κλάσης // ... } } - Κατασκευαστές: Αν η βασική κλάση έχει κατασκευαστή με παραμέτρους, η δομημένη κλάση πρέπει να καλεί αυτόν τον κατασκευαστή στη δήλωσή της.
open class Base(name: String) { // ... } class Derived(name: String, age: Int) : Base(name) { // ... } - Διασυνδέσεις (Interfaces): Μια κλάση μπορεί να υλοποιεί πολλαπλές διασυνδέσεις, και αυτές μπορούν να δηλωθούν διαχωρισμένες με κόμμα μετά την κληρονομία της κλάσης (αν υπάρχει). Οι διασυνδέσεις είναι από προεπιλογή "ανοιχτές" για υλοποίηση.
interface MyInterface { fun doSomething() } class MyClass : Base(), MyInterface { override fun doSomething() { /* ... */ } } - Αφηρημένες κλάσεις: Οι αφηρημένες κλάσεις χρησιμοποιούνται για τον ορισμό μερικής υλοποίησης και περιέχουν αφηρημένες μεθόδους και ιδιότητες (σημειωμένες με
abstract) που πρέπει να υλοποιηθούν σε υποκλάσεις. Τα μέλη που είναι αφηρημένα δεν απαιτούνopen. Η αφηρημένη κλάση επίσης δεν απαιτείopenγια κληρονομικότητα.abstract class AbsBase { abstract fun abstractMethod() open fun concreteMethod() { /* ... */ } } class AbsDerived : AbsBase() { override fun abstractMethod() { /* ... */ } }
Γενικά, το Kotlin επιδιώκει την σαφήνεια, απαιτώντας τη χρήση του open για την επιτρεπτή κληρονομικότητα και υπερκαλύψεις.