This is an old revision of the document!
Ρητές (explicit) και άρρητες (implicit) μετατροπές τύπων
Σε συνέχεια του παραδείγματος κληρονομικότητας της προηγούμενης ενότητας μπορούμε να γράψουμε
MountainBike myBike = new MountainBike();
Από την παραπάνω δήλωση η μεταβλητή myBike
είναι τύπου MountainBike
. Επειδή όμως ο τύπος MountainBike
κληρονομεί από την μεταβλητή Bicycle
η συγκεκριμένη μεταβλητή είναι και τύπου Bicycle. Επομένως, θα μπορούσαμε να γράψουμε
Bicycle myBicycle = myBike; //ή Βicycle yourBicycle = new MountainBike(2,3,4,5);
Την παραπάνω ανάθεση την ονομάζουμε άρρητη μετατροπή (implicit casting) διότι αναθέτουμε μία μεταβλητή ενός τύπου δεδομένων (myBike
) σε μία μεταβλητή γονικού τύπου δεδομένων (myBicycle
), χωρίς να ορίζουμε μία μετατροπή τύπου (type cast).
Ας δοκιμάσουμε το ανάποδο παράδειγμα τώρα
Bycycle myBicycle = new MountainBike(6,7,8,9); MountainBike myBike = myBicycle;
Σε αυτή την περίπτωση ο compiler διαμαρτύρεται, διότι η μεταβλητή myBicycle
είναι τύπου Bicycle
και δεν είναι απαραίτητο ότι είναι και τύπου MountainBike
. Αν θέλουμε να ξεπεράσουμε το παραπάνω μήνυμα λάθους του compiler θα πρέπει να γράψουμε το εξής:
Bycycle myBicycle = new MountainBike(6,7,8,9); MountainBike myBike = (MountainBike) myBicycle;
Εδώ ενημερώνουμε τον compiler ότι η μεταβλητή myBicycle
είναι και τύπου MountainBike
. Ο προγραμματιστής βεβαιώνει ότι αυτό ισχύει. Την παραπάνω ανάθεση την ονομάζουμε ρητή μετατροπή (explicit casting). Εάν δεν ισχύει η παραπάνω μετατροπή, κατά την εκτέλεση του προγράμματος θα παραχθεί μία εξαίρεση (exception). Θα δούμε πιο κάτω τι είναι και πως διαχειριζόμαστε τις εξαιρέσεις.
Ένας πιο ασφαλής τρόπος για να επαναλάβουμε τον παραπάνω κώδικα, χωρίς να παραχθεί εξαίρεση είναι ο εξής:
Bycycle myBicycle = new MountainBike(6,7,8,9); MountainBike myBike; if (myBicycle instanceof MountainBike) { myBike = (MountainBike)myBicycle; }
Προηγούμενο: Κληρονομικότητα | Περιεχόμενα | Επόμενο: Κριτήριo χρήσης της κληρονομικότητας |