Σε συνέχεια του παραδείγματος κληρονομικότητας της προηγούμενης ενότητας μπορούμε να γράψουμε
MountainBike myBike = new MountainBike();
Από την παραπάνω δήλωση η μεταβλητή myBike
είναι τύπου MountainBike
. Επειδή όμως ο τύπος MountainBike
κληρονομεί από την μεταβλητή Bicycle
η συγκεκριμένη μεταβλητή είναι και τύπου Bicycle. Επομένως, θα μπορούσαμε να γράψουμε
Bicycle myBicycle = myBike; //ή Βicycle yourBicycle = new MountainBike();
Την παραπάνω ανάθεση την ονομάζουμε άρρητη μετατροπή (implicit casting) διότι αναθέτουμε μία μεταβλητή ενός τύπου δεδομένων (myBike
) σε μία μεταβλητή γονικού τύπου δεδομένων (myBicycle
), χωρίς να ορίζουμε μία μετατροπή τύπου (type cast).
Ας δοκιμάσουμε το ανάποδο παράδειγμα τώρα
Bycycle myBicycle = new Bicycle(); MountainBike myBike = myBicycle;
Σε αυτή την περίπτωση ο compiler διαμαρτύρεται, διότι η μεταβλητή myBicycle
είναι τύπου Bicycle
και δεν είναι απαραίτητο ότι είναι και τύπου MountainBike
. Αν θέλουμε να ξεπεράσουμε το παραπάνω μήνυμα λάθους του compiler θα πρέπει να γράψουμε το εξής:
Bycycle myBicycle = new Bicycle(); MountainBike myBike = (MountainBike) myBicycle;
Εδώ ενημερώνουμε τον compiler ότι η μεταβλητή myBicycle
είναι και τύπου MountainBike
, λαμβάνοντας ο προγραμματιστής την ευθύνη ότι αυτό ισχύει. Εάν δεν ισχύει, κατά την εκτέλεση του προγράμματος θα παραχθεί μία εξαίρεση (exception)*. Θα δούμε πιο κάτω τι είναι και πως διαχειριζόμαστε τις εξαιρέσεις.
Ένας πιο ασφαλής τρόπος για να επαναλάβουμε τον παραπάνω κώδικα, χωρίς να παραχθεί εξαίρεση είναι ο εξής:
Bycycle myBicycle = new Bicycle(); MountainBike myBike; if (myBicycle instanceof MountainBike) { myBike = (MountainBike)myBicycle; }
Προηγούμενο: Κληρονομικότητα | Περιεχόμενα | Επόμενο: Κριτήριo χρήσης της κληρονομικότητας |