pbp Δημοσ. 16 Νοεμβρίου 2011 Δημοσ. 16 Νοεμβρίου 2011 Γεια σας, έχω μια απορία στην κληρονομικότητα στη java. Έστω ότι έχω μία κλάση Item και μία υποκλάση CD της Item. Αν δημιουργήσω μία μεταβλητή τύπου Item και της δώσω ως τιμή ένα αντικείμενο της κλάσης CD πχ. --> Item item = new CD(); τότε μέσω αυτής της μεταβλητής (item) ποιες μεθόδους της κλάσης CD μπορώ να καλέσω (αν μπορώ φυσικά να καλέσω κάποιες) ? Επιπλέον, γνωρίζουμε ότι στη Java όλες οι κλάσεις κληρονομούν από την κλάση Object. Αν τότε έχω μία κλάση Item και πάλι δημιουργώντας μία μεταβλητή τύπου Object και αναθέτοντάς της ως τιμή ένα αντικείμενο τύπου Item ποιες μεθόδους της κλάσης Item μπορώ να καλέσω (αν μπορώ φυσικά να καλέσω κάποιες) ? Γιατί δηλαδή να μην εκχωρώ οποιαδήποτε αντικείμενα - οποιασδήποτε κλάσης σε μεταβλητές τύπου Object πάντα ? Ευχαριστώ πολύ για το χρόνο σας.
bnvdarklord Δημοσ. 16 Νοεμβρίου 2011 Δημοσ. 16 Νοεμβρίου 2011 Τo Item Ιtem = new CD(); αν δεν κάνω λαθος ειναι ισοδύναμο με το CD item = new CD(); απλά στην πρώτη περίπτωση μπορείς να το αρχικοποιήσεις και με άλλες υποκλάσεις της Item ενώ στην δευτερη δεν μπορεις να κανεις κάτι τετοιο. Δηλαδή αν έχεις CD και Book υποκλάσεις της Item μπορεις να πεις: >Item item; item = new CD(); [...] item = newBook(); Ενώ αν το δηλώσεις ως CD απο την αρχή, δεν εχεις αυτην την δυνατότητα.
pbp Δημοσ. 16 Νοεμβρίου 2011 Μέλος Δημοσ. 16 Νοεμβρίου 2011 Τo Item Ιtem = new CD(); αν δεν κάνω λαθος ειναι ισοδύναμο με το CD item = new CD(); απλά στην πρώτη περίπτωση μπορείς να το αρχικοποιήσεις και με άλλες υποκλάσεις της Item ενώ στην δευτερη δεν μπορεις να κανεις κάτι τετοιο. Δηλαδή αν έχεις CD και Book υποκλάσεις της Item μπορεις να πεις: >Item item; item = new CD(); [...] item = newBook(); Ενώ αν το δηλώσεις ως CD απο την αρχή, δεν εχεις αυτην την δυνατότητα. Ναι αλλά αυτό που ρωτάω εγώ είναι τι γίνεται άμα πχ έχω δηλώσει Item item = new CD(); και στην κλάση CD έχω πχ μία μέθοδο Χ(). Μπορώ να πω item.X(); ??? Και αν δεν μπορώ τι μπορώ να κάνω? .. Γενικά παρατήρησα ότι άμα η κλάση Item έχει μία συνάρτηση Χ() και η CD υπερφορτώνει την Χ(), τότε μπορώ να πω item.X();. Ενώ μία ασχετη συνάρτηση που την έχει μόνο η κλάση CD px Y() Δεν μπορώ να την καλέσω μέσω της μεταβλητής item [item.Y();]. Το θέμα είναι γιατί?
bnvdarklord Δημοσ. 16 Νοεμβρίου 2011 Δημοσ. 16 Νοεμβρίου 2011 Για να το κάνεις αυτό πρεπει να κάνεις casting το item σε τύπο CD. Στην C#(δεν ειμαι σίγουρος στην Java) θα έγραφες (item as CD).Y(); edit: Σωστά, οπως ειπε ο MeTaXaS4 το casting στην Java ειναι (CD)item.Y();
MeTaXaS4 Δημοσ. 16 Νοεμβρίου 2011 Δημοσ. 16 Νοεμβρίου 2011 Μπορείς όμως να κάνεις(αν δεν κάνω λάθος) (cd)item.Y();
pbp Δημοσ. 16 Νοεμβρίου 2011 Μέλος Δημοσ. 16 Νοεμβρίου 2011 Μπορείς όμως να κάνεις(αν δεν κάνω λάθος) (cd)item.Y(); Αυτό δηλαδή γίνεται ας πούμε? > Object v = new Vehicle(...); // estw oti pernaw kapoies parametrous. (Vehicle)v.print();
bnvdarklord Δημοσ. 16 Νοεμβρίου 2011 Δημοσ. 16 Νοεμβρίου 2011 Ναι, τότε η print θα ειναι της Vehicle.
pbp Δημοσ. 16 Νοεμβρίου 2011 Μέλος Δημοσ. 16 Νοεμβρίου 2011 Ναι, τότε η print θα ειναι της Vehicle. Κ όμως μου το βγάζει Compile error. :/
bnvdarklord Δημοσ. 16 Νοεμβρίου 2011 Δημοσ. 16 Νοεμβρίου 2011 Για γραψε το error να δουμε που κανουμε λαθος.
pbp Δημοσ. 16 Νοεμβρίου 2011 Μέλος Δημοσ. 16 Νοεμβρίου 2011 Για γραψε το error να δουμε που κανουμε λαθος. >package object; public class Main { public static void main(String[] args) { Object v = new Vehicle(6,2200.0,4.9,95); (Vehicle)v.print(); } } >package object; public class Vehicle { int rodes; double weight; double lenght; int topSpeed; public Vehicle(int rodes, double weight, double lenght, int topSpeed) { this.rodes = rodes; this.weight = weight; this.lenght = lenght; this.topSpeed = topSpeed; } public void print() { System.out.println("rodes: "+rodes+"\nvaros: "+weight+"\nmikos: "+lenght+"\nmegisti taxitita: "+topSpeed); } } run: Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - not a statement at object.Main.main(Main.java:25) Java Result: 1 BUILD SUCCESSFUL (total time: 0 seconds) Η γραμμή είναι 25 γιατί είχα κάποια σχόλια πιο πάνω ...
bnvdarklord Δημοσ. 16 Νοεμβρίου 2011 Δημοσ. 16 Νοεμβρίου 2011 Από οτι φαινεται στην Java μετα απο δοκιμές που έκανα πρέπει να φτιάξεις ενα προσωρινό αντικείμενο πρώτα. Ισως γινεται και χωρίς να το κάνεις, αλλα δεν ειμαι σίγουρος πως. > public static void main(String[] args) { Object v = new Vehicle(6,2200.0,4.9,95); Vehicle vt = (Vehicle)v; vt.print(); } edit: Επειδή φευγω τώρα και δεν εχω πολύ χρόνο κοιτα για τον τελεστή instanceof
anakiou Δημοσ. 16 Νοεμβρίου 2011 Δημοσ. 16 Νοεμβρίου 2011 Method invocations allowed by the compiler are based solely on the declared type of the reference, regardless of the object type Στην περίπτωση σου αναφορά (refence) Object και τύπος αντικειμένου - object type = Vehicle http://www.learn-java-tutorial.com/Java-Inheritance.cfm http://pericles.ee.duth.gr/old_site/courses/2009-10/ProgJava/DraftSlides/DSAlg%20Java04-Objects.pdf
nplatis Δημοσ. 17 Νοεμβρίου 2011 Δημοσ. 17 Νοεμβρίου 2011 Στη γραμμή >(Vehicle)v.print(); δοκίμασε να βάλεις ακόμα μία παρένθεση (έτσι κι αλλιώς, τζάμπα είναι!) > ((Vehicle)v).print();
anakiou Δημοσ. 17 Νοεμβρίου 2011 Δημοσ. 17 Νοεμβρίου 2011 Μην προσπαθείς αυτό που κάνεις δεν γίνεται. Δες τα links Στη γραμμή (Vehicle)v.print(); δοκίμασε να βάλεις ακόμα μία παρένθεση (έτσι κι αλλιώς, τζάμπα είναι!) ((Vehicle)v).print();
pbp Δημοσ. 17 Νοεμβρίου 2011 Μέλος Δημοσ. 17 Νοεμβρίου 2011 Μην προσπαθείς αυτό που κάνεις δεν γίνεται. Δες τα links Τι εννοείς δε γίνεται ? Αφού δουλεύει... Πάντως αν δε γίνεται, δεν μπορώ να καταλάβω το νόημα μιας ArrayList<Υπερκλάση> Και σε αυτην να αποθηκεύουμε αντικείμενα υποκλάσεων. Δε λέω εξυπηρετεί την εννοια του πολυμορφισμού αλλά τι νόημα έχει αν μετά δεν μπορείς να χρησημοποιήσεις τις μεθόδους των αντικείμένων που βρίσκονται στην ArrayList..?
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα