Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα , έχω ένα πρόβλημα.

Έχω μια κλάση Κυκλος και μια υποκλαση κυλινδρος

Στην κλάση κυκλος υπολογίζω το εμβαδόν σε μια μέθοδο  και έχω μια 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. αν θελω να αλλαξω την ακτινα που ειναι πεδίο του κύκλου πως θα το κανω αν εχω αντικειμενο τυπου κυλινδρος;

Επεξ/σία από Fabricated
  • Moderators
Δημοσ.

Λίγο μπερδεμένα τα λες. Βάλε τις κλάσεις του κύκλου και του κύλινδρου να ξέρουμε ακριβώς τι έχεις κάνει.

Δημοσ.

Δε βλέπω κύλινδρο.

Επίσης, αυτό το inheritance που περιγράφεις εδώ είναι όχι απλά ιδανικό αλλά πέρα από τη φαντασία παράδειγμα του τι να ΜΗΝ κάνεις.

Αν σας έχει ζητηθεί έτσι ακριβώς, συλλυπητήρια που θα μάθετε πώς να γράφετε class extends και απολύτως τίποτα για το πότε να το γράφετε και γιατί (ή όχι).

Sad face.

Δημοσ.

Κατά λάθος έβαλα 2 φορές τον κύκλο. Θα βάλω τώρα τον κύλινδρο. Αν θες να γίνεις και λίγο πιο συγκεκριμένος στα υπόλοιπα περί κληρονομικότητας θα το εκτιμούσα. Μας ζητήθηκε αυτό ακριβώς που κάνω, το μόνο λάθος μπορεί να είναι στον τρόπο που κάνω μια μέθοδο Η κάτι τέτοιο. Οι κλάσεις ζητήθηκαν έτσι , οι constructor το ίδιο. Η main ζητάει να ζητήσουμε ακτίνα και χρώμα από τον χρήστη (έβαλα κατευθείαν το χρώμα μόνος μου) και μετά λέει να ζητήσουμε το ύψος για να φτιάξουμε κύλινδρο. Και διαχωρίζει τις περιπτώσεις που δοθεί ύψος και δεν δοθεί(μικρότερο του 0)

Δημοσ.
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.

Δημοσ. (επεξεργασμένο)
12 λεπτά πριν, defacer είπε

Δε χρειάζεται να κάνεις τίποτα περισσότερο, απλά όπως θα το έκανες και αν είχες instance της super.

Δεν κατάλαβα καλά. Δηλαδή να αναφέρω απλά το όνομα της μεταβλητής ; Αφού είναι της υπερκλασης(εκεί έχει δηλωθεί εννοώ ). Εκτός αν την κάνω protected Αλλά μας έχουν πει να μην το κάνουμε αν δεν το ζητάει προς το παρόν 

ανεβασα και τις 3 κλασεις, αν μπορει καποιος να νβοηθησει και στα αρχικα ερωτηματα

(Θα ψάξω αυτό που μου είπες , εφόσον υπάρχει και με το συγκεκριμένο ακριβώς κρίμα όντως που τα διδασκόμαστε έτσι,αν και ίσως το κάνουν για να μάθουμε τον τρόπο)

Επεξ/σία από Fabricated
Δημοσ.
31 λεπτά πριν, Fabricated είπε

Δεν κατάλαβα καλά. Δηλαδή να αναφέρω απλά το όνομα της μεταβλητής ; Αφού είναι της υπερκλασης(εκεί έχει δηλωθεί εννοώ ). Εκτός αν την κάνω protected Αλλά μας έχουν πει να μην το κάνουμε αν δεν το ζητάει προς το παρόν 

Το base class (Kiklos) σου έχει ήδη τους setters που ανανεώνουν τις τιμές των private μεταβλητών του. Οπότε, εάν θες να αλλάξεις το περιεχόμενο μιας τέτοιας μεταβλητής μέσω του subclass σου (Kilindros) δεν έχεις παρά να χρησιμοποιήσεις τους setters που παρέχονται από το base class.
 

Kilindros cylinder = new Kilindros(5, "red", 5);
        
cylinder.setAkt(12);

 

Δημοσ.
17 λεπτά πριν, DeadElectron είπε

Το base class (Kiklos) σου έχει ήδη τους setters που ανανεώνουν τις τιμές των private μεταβλητών του. Οπότε, εάν θες να αλλάξεις το περιεχόμενο μιας τέτοιας μεταβλητής μέσω του subclass σου (Kilindros) δεν έχεις παρά να χρησιμοποιήσεις τους setters που παρέχονται από το base class.
 


Kilindros cylinder = new Kilindros(5, "red", 5);
        
cylinder.setAkt(12);

το eclipse μου πεταγε προβλημα οτι δεν υπαρχει τετοια μεθοδος στην κυλινδρος(ενω υποτιθεται την εχει κληρονομησει). θα το ξανα προσπαθησω αλλα νομιζω ετσι μου ελεγε

Δημοσ.
8 λεπτά πριν, Fabricated είπε

το eclipse μου πεταγε προβλημα οτι δεν υπαρχει τετοια μεθοδος στην κυλινδρος(ενω υποτιθεται την εχει κληρονομησει). θα το ξανα προσπαθησω αλλα νομιζω ετσι μου ελεγε

Από τη στιγμή που έχει δηλωθεί ως public στο base class τότε κληρονομείται στα subclasses και μπορούν να τη χρησιμοποιήσουν.

Δημοσ. (επεξεργασμένο)
29 λεπτά πριν, DeadElectron είπε

Από τη στιγμή που έχει δηλωθεί ως public στο base class τότε κληρονομείται στα subclasses και μπορούν να τη χρησιμοποιήσουν.

Ξαφνικα δουλεψε ετσι

Αλλα το αλλο προβλημα ακομα υπαρχει. περναει τις εντολες sc.nextLine() και αντιστοιχα την set... Δεν ξερω γιατι. μεσα στην else μπαινει παντως γιατι μου ζηταει να δωσω χρωμα

Επισης καταλαβε καποιος γιατι στην toString μου βγαζει το ιδιο εμβαδον;

εδιτ: η εντολη newc = sc.nextLine; δεν τρεχει

η εντολη σκετη sc.nextLine τρεχει κανονικα, δεν ξερω τι συμβαινει

Επεξ/σία από Fabricated
Δημοσ. (επεξεργασμένο)
18 λεπτά πριν, Fabricated είπε

Επισης καταλαβε καποιος γιατι στην toString μου βγαζει το ιδιο εμβαδον;

Το εμβαδόν στο εμφανίζει ίδιο γιατί όταν καλείς τη μέθοδο «toString()» του base class με τη βοήθεια του keyword «super» χρησιμοποιείς μεν την υλοποίηση του base class αλλά το «this» εξακολουθεί να δείχνει στο object τύπου «Kilindros». Οπότε, όταν γίνεται η κλήση της «emvadon()» πρακτικά καλείται η υλοποίηση του subclass, γι' αυτό σου εμφανίζει το ίδιο αποτέλεσμα.

Επεξ/σία από DeadElectron
  • Like 1
Δημοσ.

Debug το έχεις κάνει φίλε μου?

Έτσι θα σου λυθούν και οι 2 απορίες και θα καταλάβεις το flow πού ακολουθεί το πρόγραμμα σου , κάνετε watch και τις μεταβλητές.

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...