Fabricated Δημοσ. 12 Ιουνίου 2018 Δημοσ. 12 Ιουνίου 2018 (επεξεργασμένο) Καλησπέρα , έχω ένα πρόβλημα. Έχω μια κλάση Κυκλος και μια υποκλαση κυλινδρος Στην κλάση κυκλος υπολογίζω το εμβαδόν σε μια μέθοδο και έχω μια to string που εμφανίζει το εμβαδόν καλώντας την μέθοδο Στην κλάση κυλινδρος υπολογίζω ένα νέο εμβαδόν(πολλαπλασίασε το παλιό με κάτι) Και έχω μια to string που πρώτα κάλει την super.toString και μετά εμφανίζει το νέο εμβαδόν μέσω της νέας μεθόδου. Οι 2 toString και το νέο εμβαδόν έχουν γίνει override. Το πρόβλημα μου είναι ότι όταν καλείται η 2η toString το εμβαδόν βγάζει το ίδιο νούμερο. Δηλαδή αντί να εμφανίζει το εμβαδόν της κυκλος και της κυλινδρος εμφανίζει το εμβαδόν της κυλινδρος 2 φορές. Επίσης κατι γίνεται και δεν περιμενει να διαβασει string στην else: package Lab3; import java.util.Scanner; public class mein { public static void main(String []args ) { Scanner sc = new Scanner(System.in); System.out.println("dose aktina"); double akt = sc.nextDouble(); Kiklos kiklaki = new Kiklos(akt,"red"); System.out.println(kiklaki); Kilindros kal; System.out.println("dose ipsos"); double ipsos = sc.nextDouble(); String newc; if (ipsos>0) { kal = new Kilindros(akt,"red",ipsos); } else { kal = new Kilindros(akt,"red"); System.out.println("dose xroma"); newc = sc.nextLine(); kiklaki.setCol(newc); } System.out.println(kal.toString()); } } package Lab3; public class Kiklos { private double akt; private String col; public Kiklos(double akt, String col) { this.akt = akt; this.col = col; } public Kiklos() { this(2,"kokkino"); } public double emvadon() { return akt*2; } @Override public String toString() { return "Kiklos [akt=" + akt + ", col=" + col + ", emvadon()=" + emvadon() + "]"; } public double getAkt() { return akt; } public void setAkt(double akt) { this.akt = akt; } public String getCol() { return col; } public void setCol(String col) { this.col = col; } } package Lab3; public class Kilindros extends Kiklos { private double ipsos; public Kilindros(double akt, String col) { this(akt,col,1); } @Override public double emvadon() { return super.emvadon()*ipsos; } public Kilindros(double akt, String col,double ipsos) { super(akt, col); this.ipsos = ipsos; } @Override public String toString() { return "Kilindros [ipsos=" + ipsos + ", emvadon()=" + emvadon() + "," + super.toString() + "]"; } } Και μια τελευταία ερώτηση αν εχω κυλινδρο, δηλαδη την υποκλαση, και θελω να αλλαξω ενα στοιχειο του το οποιο κληρονομει απο την υπερκλαση κυκλος πως το κανω; Βαζω μια setVariable η οποία κάνει super.setVar ; p.x. αν θελω να αλλαξω την ακτινα που ειναι πεδίο του κύκλου πως θα το κανω αν εχω αντικειμενο τυπου κυλινδρος; Επεξ/σία 12 Ιουνίου 2018 από Fabricated
Moderators Kercyn Δημοσ. 12 Ιουνίου 2018 Moderators Δημοσ. 12 Ιουνίου 2018 Λίγο μπερδεμένα τα λες. Βάλε τις κλάσεις του κύκλου και του κύλινδρου να ξέρουμε ακριβώς τι έχεις κάνει.
defacer Δημοσ. 12 Ιουνίου 2018 Δημοσ. 12 Ιουνίου 2018 Δε βλέπω κύλινδρο. Επίσης, αυτό το inheritance που περιγράφεις εδώ είναι όχι απλά ιδανικό αλλά πέρα από τη φαντασία παράδειγμα του τι να ΜΗΝ κάνεις. Αν σας έχει ζητηθεί έτσι ακριβώς, συλλυπητήρια που θα μάθετε πώς να γράφετε class extends και απολύτως τίποτα για το πότε να το γράφετε και γιατί (ή όχι). Sad face.
Fabricated Δημοσ. 12 Ιουνίου 2018 Μέλος Δημοσ. 12 Ιουνίου 2018 Κατά λάθος έβαλα 2 φορές τον κύκλο. Θα βάλω τώρα τον κύλινδρο. Αν θες να γίνεις και λίγο πιο συγκεκριμένος στα υπόλοιπα περί κληρονομικότητας θα το εκτιμούσα. Μας ζητήθηκε αυτό ακριβώς που κάνω, το μόνο λάθος μπορεί να είναι στον τρόπο που κάνω μια μέθοδο Η κάτι τέτοιο. Οι κλάσεις ζητήθηκαν έτσι , οι constructor το ίδιο. Η main ζητάει να ζητήσουμε ακτίνα και χρώμα από τον χρήστη (έβαλα κατευθείαν το χρώμα μόνος μου) και μετά λέει να ζητήσουμε το ύψος για να φτιάξουμε κύλινδρο. Και διαχωρίζει τις περιπτώσεις που δοθεί ύψος και δεν δοθεί(μικρότερο του 0)
defacer Δημοσ. 12 Ιουνίου 2018 Δημοσ. 12 Ιουνίου 2018 8 minutes ago, Fabricated said: Μας ζητήθηκε αυτό ακριβώς που κάνω Το φαντάζομαι, γι αυτό είπα συλλυπητήρια. Πολύ συνοπτικά γιατί δε μπορώ περισσότερο τώρα, το facepalm εδώ είναι ότι σας μαθαίνουν πως γίνονται κάποια πράγματα σε μηχανικό επίπεδο, και όσον αφορά το ΓΙΑΤΊ χρησιμοποιούμε έτσι το τάδε εργαλείο (inheritance) και ΤΙ ΣΗΜΑΊΝΕΙ πως μια class κάνει inherit μια άλλη, και ακόμα πιο πίσω τι αντιπροσωπεύει μια class... εκεί όχι δεν θα διδάσκουν, αλλά διδάσκουν αντιπαραδείγματα. Στις περισσότερες περιπτώσεις δεν ξέρουν και καλύτερα οι ίδιοι. Κάποια πράγματα που μπορείς να ψάξεις αν σε ενδιαφέρει είναι τα πολύ κλασικά "why car should not inherit from engine" και "why square (circle) should not inherit from rectangle (ellipse)". Αν θες τη θεωρητική ουσία της υπόθεσης, Google Liskov Substitution Principle. Μπορούμε να το συζητήσουμε κι εδώ αν έχεις διάθεση αφού τα δεις. 2 hours ago, Fabricated said: αν εχω κυλινδρο, δηλαδη την υποκλαση, και θελω να αλλαξω ενα στοιχειο του το οποιο κληρονομει απο την υπερκλαση κυκλος πως το κανω; Βαζω μια setVariable η οποία κάνει super.setVar ; Δε χρειάζεται να κάνεις τίποτα περισσότερο, απλά όπως θα το έκανες και αν είχες instance της super.
Fabricated Δημοσ. 12 Ιουνίου 2018 Μέλος Δημοσ. 12 Ιουνίου 2018 (επεξεργασμένο) 12 λεπτά πριν, defacer είπε Δε χρειάζεται να κάνεις τίποτα περισσότερο, απλά όπως θα το έκανες και αν είχες instance της super. Δεν κατάλαβα καλά. Δηλαδή να αναφέρω απλά το όνομα της μεταβλητής ; Αφού είναι της υπερκλασης(εκεί έχει δηλωθεί εννοώ ). Εκτός αν την κάνω protected Αλλά μας έχουν πει να μην το κάνουμε αν δεν το ζητάει προς το παρόν ανεβασα και τις 3 κλασεις, αν μπορει καποιος να νβοηθησει και στα αρχικα ερωτηματα (Θα ψάξω αυτό που μου είπες , εφόσον υπάρχει και με το συγκεκριμένο ακριβώς κρίμα όντως που τα διδασκόμαστε έτσι,αν και ίσως το κάνουν για να μάθουμε τον τρόπο) Επεξ/σία 12 Ιουνίου 2018 από Fabricated
DeadElectron Δημοσ. 12 Ιουνίου 2018 Δημοσ. 12 Ιουνίου 2018 31 λεπτά πριν, Fabricated είπε Δεν κατάλαβα καλά. Δηλαδή να αναφέρω απλά το όνομα της μεταβλητής ; Αφού είναι της υπερκλασης(εκεί έχει δηλωθεί εννοώ ). Εκτός αν την κάνω protected Αλλά μας έχουν πει να μην το κάνουμε αν δεν το ζητάει προς το παρόν Το base class (Kiklos) σου έχει ήδη τους setters που ανανεώνουν τις τιμές των private μεταβλητών του. Οπότε, εάν θες να αλλάξεις το περιεχόμενο μιας τέτοιας μεταβλητής μέσω του subclass σου (Kilindros) δεν έχεις παρά να χρησιμοποιήσεις τους setters που παρέχονται από το base class. Kilindros cylinder = new Kilindros(5, "red", 5); cylinder.setAkt(12);
Fabricated Δημοσ. 12 Ιουνίου 2018 Μέλος Δημοσ. 12 Ιουνίου 2018 17 λεπτά πριν, DeadElectron είπε Το base class (Kiklos) σου έχει ήδη τους setters που ανανεώνουν τις τιμές των private μεταβλητών του. Οπότε, εάν θες να αλλάξεις το περιεχόμενο μιας τέτοιας μεταβλητής μέσω του subclass σου (Kilindros) δεν έχεις παρά να χρησιμοποιήσεις τους setters που παρέχονται από το base class. Kilindros cylinder = new Kilindros(5, "red", 5); cylinder.setAkt(12); το eclipse μου πεταγε προβλημα οτι δεν υπαρχει τετοια μεθοδος στην κυλινδρος(ενω υποτιθεται την εχει κληρονομησει). θα το ξανα προσπαθησω αλλα νομιζω ετσι μου ελεγε
DeadElectron Δημοσ. 12 Ιουνίου 2018 Δημοσ. 12 Ιουνίου 2018 8 λεπτά πριν, Fabricated είπε το eclipse μου πεταγε προβλημα οτι δεν υπαρχει τετοια μεθοδος στην κυλινδρος(ενω υποτιθεται την εχει κληρονομησει). θα το ξανα προσπαθησω αλλα νομιζω ετσι μου ελεγε Από τη στιγμή που έχει δηλωθεί ως public στο base class τότε κληρονομείται στα subclasses και μπορούν να τη χρησιμοποιήσουν.
Fabricated Δημοσ. 12 Ιουνίου 2018 Μέλος Δημοσ. 12 Ιουνίου 2018 (επεξεργασμένο) 29 λεπτά πριν, DeadElectron είπε Από τη στιγμή που έχει δηλωθεί ως public στο base class τότε κληρονομείται στα subclasses και μπορούν να τη χρησιμοποιήσουν. Ξαφνικα δουλεψε ετσι :ρ Αλλα το αλλο προβλημα ακομα υπαρχει. περναει τις εντολες sc.nextLine() και αντιστοιχα την set... Δεν ξερω γιατι. μεσα στην else μπαινει παντως γιατι μου ζηταει να δωσω χρωμα Επισης καταλαβε καποιος γιατι στην toString μου βγαζει το ιδιο εμβαδον; εδιτ: η εντολη newc = sc.nextLine; δεν τρεχει η εντολη σκετη sc.nextLine τρεχει κανονικα, δεν ξερω τι συμβαινει Επεξ/σία 12 Ιουνίου 2018 από Fabricated
DeadElectron Δημοσ. 12 Ιουνίου 2018 Δημοσ. 12 Ιουνίου 2018 (επεξεργασμένο) 18 λεπτά πριν, Fabricated είπε Επισης καταλαβε καποιος γιατι στην toString μου βγαζει το ιδιο εμβαδον; Το εμβαδόν στο εμφανίζει ίδιο γιατί όταν καλείς τη μέθοδο «toString()» του base class με τη βοήθεια του keyword «super» χρησιμοποιείς μεν την υλοποίηση του base class αλλά το «this» εξακολουθεί να δείχνει στο object τύπου «Kilindros». Οπότε, όταν γίνεται η κλήση της «emvadon()» πρακτικά καλείται η υλοποίηση του subclass, γι' αυτό σου εμφανίζει το ίδιο αποτέλεσμα. Επεξ/σία 12 Ιουνίου 2018 από DeadElectron 1
Fabricated Δημοσ. 12 Ιουνίου 2018 Μέλος Δημοσ. 12 Ιουνίου 2018 το προβλημα λυθηκε με την next(); δεν ξερω τι πως που, java ειναι οτι θελει κανει
tsofras Δημοσ. 12 Ιουνίου 2018 Δημοσ. 12 Ιουνίου 2018 Debug το έχεις κάνει φίλε μου? Έτσι θα σου λυθούν και οι 2 απορίες και θα καταλάβεις το flow πού ακολουθεί το πρόγραμμα σου , κάνετε watch και τις μεταβλητές. 1
Fabricated Δημοσ. 12 Ιουνίου 2018 Μέλος Δημοσ. 12 Ιουνίου 2018 δεν εχω μαθει ακομα απο αυτα οποτε δυσκολο 😢
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα