java:type_casting
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
java:type_casting [2016/02/15 08:52] – gthanos | java:type_casting [Unknown date] (current) – external edit (Unknown date) 127.0.0.1 | ||
---|---|---|---|
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; | + | |
- | </ | + | |
- | + | ||
- | Για παράδειγμα, | + | |
- | + | ||
- | Στην περίπτωση που περιγράψαμε παραπάνω κάτι τέτοιο δεν ισχύει. Αν και η κλάση του κυβοειδούς | + | |
- | + | ||
- | |Προηγούμενο: | + |
java/type_casting.1455526366.txt.gz · Last modified: 2016/02/15 08:52 by gthanos