Sobes.tech
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 για την επιτρεπτή κληρονομικότητα και υπερκαλύψεις.