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:type_casting [2016/02/15 08:52] gthanos |
java:type_casting [2021/04/05 16:02] gthanos |
||
|---|---|---|---|
| Line 4: | Line 4: | ||
| <code java> | <code java> | ||
| - | MountainBike myBike | + | Rectangle r1 = new Rectangle(100, |
| </ | </ | ||
| - | Από την παραπάνω δήλωση η μεταβλητή '' | + | Από την παραπάνω δήλωση η μεταβλητή '' |
| <code java> | <code java> | ||
| - | Bicycle myBicycle | + | BasicRectangle r2 = r1; |
| - | // | + | // |
| - | Βicycle yourBicycle | + | BasicRectangle r2 = new Rectangle(100, |
| </ | </ | ||
| - | Την παραπάνω ανάθεση την ονομάζουμε άρρητη μετατροπή (//implicit casting//) διότι αναθέτουμε | + | Την παραπάνω ανάθεση την ονομάζουμε άρρητη μετατροπή (//implicit casting//) διότι αναθέτουμε |
| + | |||
| + | Αν θέλουμε να ζωγραφίσουμε τον κώδικα του προηγούμενου παραδείγματος μπορούμε να το κάνουμε όπως στο παρακάτω σχήμα. Παρατηρήστε ότι η μεταβλητές **r1** και **r2** δείχνουν στο ίδιο αντικείμενο. Η διαφορά είναι ότι η **r2** αν και δείχνει σε ένα αντικείμενο τύπου **Rectangle**, | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === Ρητή μετατροπή === | ||
| Ας δοκιμάσουμε το ανάποδο παράδειγμα τώρα | Ας δοκιμάσουμε το ανάποδο παράδειγμα τώρα | ||
| <code java> | <code java> | ||
| - | Bycycle myBicycle | + | BasicRectangle r3 = new Rectangle(100, |
| - | MountainBike myBike | + | Rectangle r4 = r3; |
| </ | </ | ||
| - | Σε αυτή την περίπτωση ο compiler διαμαρτύρεται, | + | Σε αυτή την περίπτωση ο //compiler// διαμαρτύρεται, |
| <code java> | <code java> | ||
| - | Bycycle myBicycle | + | BasicRectangle r3 = new Rectangle(100, |
| - | MountainBike myBike | + | Rectangle r4 = (Rectangle)r3; |
| </ | </ | ||
| - | Εδώ | + | Σε αυτή την περίπτωση ο προγραμματιστής βεβαιώνει τον |
| - | Ένας πιο ασφαλής τρόπος για να επαναλάβουμε τον παραπάνω κώδικα, | + | Ένας πιο ασφαλής τρόπος για να επαναλάβουμε τον παραπάνω κώδικα, |
| <code java> | <code java> | ||
| - | Bycycle myBicycle | + | BasicRectangle r3 = new Rectangle(100, |
| - | MountainBike myBike; | + | Rectangle r4; |
| - | if (myBicycle | + | if (r3 instanceof |
| - | | + | |
| } | } | ||
| </ | </ | ||
| - | ===== Κριτήρια χρήσης της κληρονομικότητας ως εργαλείο ανάπτυξης λογισμικού ===== | + | |Προηγούμενο: [[ :java:inheritance |
| - | + | ||
| - | Ας επανέλθουμε στο παράδειγμα του ορθογωνίου παραλληλογράμμου το οποίο έχουμε συναντήσει αρκετές φορές στο παρελθόν και ας προσπαθήσουμε να δημιουργήσουμε την κλάση ενός [[wp> | + | |
| - | + | ||
| - | Πριν ξεκινήσουμε την υλοποίηση θα πρέπει να αποφασίσουμε εάν θέλουμε να δημιουργήσουμε το κυβοειδές χρησιμοποιώντας ως μεταβλητή της νέας κλάσης ένα αντικείμενο της κλάσης // | + | |
| - | + | ||
| - | <code java Cuboid.java> | + | |
| - | public class Cuboid { | + | |
| - | Rectangle rec; | + | |
| - | int length; | + | |
| - | + | ||
| - | public Cuboid(int l, int w, int h) { | + | |
| - | rec = new Rectangle(w, | + | |
| - | length = l; | + | |
| - | } | + | |
| - | + | ||
| - | public int getLength() { return length; } | + | |
| - | public void setLength(int l) { length = l; } | + | |
| - | + | ||
| - | public int volume() { return length * rec.area(); } | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | ή | + | |
| - | + | ||
| - | <code java Cuboid.java> | + | |
| - | public class Cuboid extends Rectangle { | + | |
| - | int length; | + | |
| - | + | ||
| - | public Cuboid(int l, int w, int h) { | + | |
| - | super(w, | + | |
| - | length = l; | + | |
| - | } | + | |
| - | + | ||
| - | public int getLength() { return length; } | + | |
| - | public void setLength(int l) { length = l; } | + | |
| - | + | ||
| - | public int volume() { return length * area(); } | + | |
| - | } | + | |
| - | </ | + | |
| - | + | ||
| - | Οι παραπάνω δύο κλάσεις μεταγλωττίζονται και παράγουν το ίδιο λειτουργικό αποτέλεσμα. Το ερώτημα είναι ποια από τις δύο μεθόδους θα προτιμήσουμε. Η απάντηση είναι απλή και συνίσταται στο εξής: Εάν ο νέος τύπος δεδομένων που προκύπτει ανήκει στον τύπο δεδομένων της αρχικής κλάσης τότε μπορούμε να χρησιμοποιήσουμε την κληρονομικότητα ως μέθοδο ανάπτυξης. Εάν όμως ο νέος τύπος δεδομένων δεν αποτελεί τύπο δεδομένων και της παραπάνω κατηγορίας. | + | |
| - | + | ||
| - | Εκφράζοντας το παραπάνω με κώδικα, | + | |
| - | <code java> | + | |
| - | InheritedClass child = new InheritedClass(); | + | |
| - | ParentClass parent = child; | + | |
| - | </ | + | |
| - | + | ||
| - | Για παράδειγμα, | + | |
| - | + | ||
| - | Στην περίπτωση που περιγράψαμε παραπάνω κάτι τέτοιο δεν ισχύει. Αν και η κλάση του κυβοειδούς | + | |
| - | + | ||
| - | |Προηγούμενο: | + | |