Sobes.tech
Middle

Τι είναι η κληρονομικότητα και ο πολυμορφισμός στους τύπους δεδομένων αναφοράς;

sobes.tech AI

Απάντηση από AI

Κληρονομικότητα είναι ένας μηχανισμός που επιτρέπει σε μια νέα κλάση (υποκλάση, υποκατηγορία) να κληρονομήσει πεδία και μεθόδους μιας υπάρχουσας κλάσης (γονική κλάση, υπερκλάση). Αυτό προάγει την επανάχρηση κώδικα και την ιεραρχία των κλάσεων.

Ο πολυμορφισμός (ποικιλία μορφών) είναι η ικανότητα ενός αντικειμένου να έχει πολλές μορφές. Στο πλαίσιο των αναφορικών τύπων δεδομένων, αυτό σημαίνει ότι μια μεταβλητή υπερκλάσης μπορεί να αναφέρεται σε ένα αντικείμενο υποκλάσης. Αυτό επιτρέπει την επεξεργασία αντικειμένων διαφορετικών υποκλάσεων με ενιαίο τρόπο μέσω μιας κοινής διεπαφής ή υπερκλάσης.

Υπάρχουν δύο βασικοί τύποι πολυμορφισμού:

  1. Χρόνος μεταγλώττισης (στατικός πολυμορφισμός): επιτυγχάνεται συνήθως μέσω υπερφόρτωσης μεθόδων (method overloading), όταν σε μια κλάση υπάρχουν πολλές μέθοδοι με το ίδιο όνομα αλλά διαφορετικές υπογραφές (αριθμό και/ή τύπους παραμέτρων).
  2. Χρόνος εκτέλεσης (δυναμικός πολυμορφισμός): επιτυγχάνεται μέσω υπερκάλυψης μεθόδων (method overriding), όταν μια υποκλάση παρέχει τη δική της υλοποίηση μιας μεθόδου που έχει ήδη οριστεί στην υπερκλάση. Όταν καλείται αυτή η μέθοδος μέσω μιας αναφοράς στην υπερκλάση, εκτελείται η υλοποίηση της υποκλάσης (αν ο τύπος του αντικειμένου είναι υποκλάση).

Παράδειγμα κληρονομικότητας και δυναμικού πολυμορφισμού:

// Βασική κλάση
class Animal {
    public void makeSound() {
        System.out.println("Γενικός ήχος ζώου");
    }
}

// Υποκλάση
class Dog extends Animal {
    @Override // Υπερκαλύπτει τη μέθοδο
    public void makeSound() {
        System.out.println("Γουφ!");
    }
}

// Υποκλάση
class Cat extends Animal {
    @Override // Υπερκαλύπτει τη μέθοδο
    public void makeSound() {
        System.out.println("Μιάου!");
    }
}

public class Main {
    public static void main(String[] args) {
        // Στατικός τύπος της μεταβλητής Animal, δυναμικός τύπος του αντικειμένου Dog
        Animal myDog = new Dog();
        // Στατικός τύπος της μεταβλητής Animal, δυναμικός τύπος του αντικειμένου Cat
        Animal myCat = new Cat();
        // Στατικός τύπος της μεταβλητής Animal, δυναμικός τύπος του αντικειμένου Animal
        Animal genericAnimal = new Animal();

        // Επίδειξη πολυμορφισμού
        myDog.makeSound(); // Θα καλέσει τη μέθοδο από το Dog
        myCat.makeSound(); // Θα καλέσει τη μέθοδο από το Cat
        genericAnimal.makeSound(); // Θα καλέσει τη μέθοδο από το Animal
    }
}

Σε αυτό το παράδειγμα, Dog και Cat κληρονομούν από το Animal. Οι μεταβλητές myDog, myCat και genericAnimal έχουν στατικό τύπο Animal, αλλά αναφέρονται σε αντικείμενα διαφορετικών δυναμικών τύπων (Dog, Cat, Animal). Όταν καλείται η μέθοδος makeSound(), εκτελείται η υλοποίηση της μεθόδου ανάλογα με τον δυναμικό τύπο του αντικειμένου, που αποτελεί πολυμορφισμό χρόνου εκτέλεσης.