This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
java:inheritance [2015/02/13 13:03] gthanos [Τι μπορούμε να κάνουμε σε μία υποκλάση...] |
java:inheritance [2015/02/13 13:56] gthanos [Implicit και Explicit Casting of Objects] |
||
---|---|---|---|
Line 4: | Line 4: | ||
{{ :java:super_sub_class.jpg | }} | {{ :java:super_sub_class.jpg | }} | ||
- | |||
Όπως φαίνεται και στο παραπάνω σχήμα μία κλάση (//subclass//) μπορεί να κληρονομεί __**ΜΟΝΟ ΜΙΑ**__ άλλη κλάση. Αντίστροφα μία κλάση (//superclass//) μπορεί να κληρονομεί πολλές διαφορετικές κλάσεις. Παρακάτω δίνουμε το παράδειγμα κληρονομικότητας που παρουσιάσαμε νωρίτερα ελαφρά παραλλαγμένο. | Όπως φαίνεται και στο παραπάνω σχήμα μία κλάση (//subclass//) μπορεί να κληρονομεί __**ΜΟΝΟ ΜΙΑ**__ άλλη κλάση. Αντίστροφα μία κλάση (//superclass//) μπορεί να κληρονομεί πολλές διαφορετικές κλάσεις. Παρακάτω δίνουμε το παράδειγμα κληρονομικότητας που παρουσιάσαμε νωρίτερα ελαφρά παραλλαγμένο. | ||
Line 100: | Line 99: | ||
===== Implicit και Explicit Casting of Objects ===== | ===== Implicit και Explicit Casting of Objects ===== | ||
+ | Σε συνέχεια του προηγούμενου παραδείγματος κληρονομικότητας μπορούμε να γράψουμε | ||
+ | <code java> | ||
+ | MountainBike myBike = new MountainBike(); | ||
+ | </code> | ||
+ | Από την παραπάνω δήλωση η μεταβλητή ''myBike'' είναι τύπου ''MountainBike''. Επειδή όμως ο τύπος ''MountainBike'' κληρονομεί από την μεταβλητή ''Bicycle'' η συγκεκριμένη μεταβλητή είναι και τύπου Bicycle. Επομένως θα μπορούσαμε να γράψουμε | ||
+ | <code java> | ||
+ | Bicycle myBicycle = myBike; | ||
+ | //ή | ||
+ | Βicycle yourBicycle = new MountainBike(); | ||
+ | </code> | ||
+ | |||
+ | Την παραπάνω ανάθεση την ονομάζουμε //Implicit Casting// διότι αναθέτουμε μία μεταβλητή ενός τύπου δεδομένων (''myBike'') σε μία μεταβλητή γονικού τύπου δεδομένων (''myBicycle''), χωρίς type casting. | ||
+ | |||
+ | Ας δοκιμάσουμε το ανάποδο παράδειγμα τώρα | ||
+ | |||
+ | <code java> | ||
+ | Bycycle myBicycle = new Bicycle(); | ||
+ | MountainBike myBike = myBicycle; | ||
+ | </code> | ||
+ | |||
+ | Σε αυτή την περίπτωση ο compiler διαμαρτύρεται, διότι η μεταβλητή ''myBicycle'' είναι τύπου ''Bicycle'' και δεν είναι απαραίτητο ότι είναι και τύπου ''MountainBike''. Αν θέλουμε να ξεπεράσουμε το παραπάνω πρόβλημα θα πρέπει να γράψουμε το εξής: | ||
+ | |||
+ | <code java> | ||
+ | Bycycle myBicycle = new Bicycle(); | ||
+ | MountainBike myBike = (MountainBike) myBicycle; | ||
+ | </code> | ||
+ | |||
+ | Εδώ ενημερώνουμε τον compiler ότι η μεταβλητή ''myBicycle'' είναι και τύπου ''MountainBike'', λαμβάνοντας ο προγραμματιστής την ευθύνη ότι κάτι τέτοιο ισχύει. Εάν δεν ισχύει κάτι τέτοιο κατά την εκτέλεση του προγράμματος θα παραχθεί μία εξαίρεση (exception)*. Θα δούμε πιο κάτω τι είναι και πως διαχειριζόμαστε τις εξαιρέσεις. | ||
+ | |||
+ | Ένας πιο ασφαλής τρόπος για να επαναλάβουμε τον παραπάνω κώδικα, χωρίς να παραχθεί εξαίρεση είναι ο εξής: | ||
+ | |||
+ | <code java> | ||
+ | Bycycle myBicycle = new Bicycle(); | ||
+ | MountainBike myBike; | ||
+ | if (myBicycle instanceof MountainBike) { | ||
+ | myBike = (MountainBike)myBicycle; | ||
+ | } | ||
+ | </code> | ||