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

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

Δημοσ.

Καλημέρα έχω να κάνω μια εργασία σε java η εκφώνηση 

20130703_111039.jpg

 

και ο κώδικας που έγραψα δεν μπορώ να καταλάβω πως θα κάνω videoClub και θα και DVD.

 

VideoClub

public class VideoClub {
    
    private String Adress,Telephone,Timeclock;
    
    public VideoClub(){}
    
    public VideoClub(String Adress, String Telephone, String Timeclock){
    this.Adress=Adress;
    this.Telephone=Telephone;
    this.Timeclock=Timeclock;
    
    }
    
    public String toString(){
    return "I dieuthinsi tou videoClub einai "+this.Adress+" To tilephono einai "+this.Telephone+" Orologio programa "+this.Timeclock;    }
    
    
}

dvd 

public class DVD {
     private String Code,Title,Kind,Daty,Rates;
    
    public DVD(){}
    public DVD(String Code,String Title,String Kind,String Daty,String Rates){
    this.Code=Code;
    this.Daty=Daty;
    this.Kind=Kind;
    this.Rates=Rates;
    this.Title=Title;}
}

cd

public class CD {
    private String Code,Title,Kind,Lots,Singers,Daty;
    
    public CD(){}
    public CD(String Code,String Title,String Kind,String Daty,String Rates){
    this.Code=Code;
    this.Daty=Daty;
    this.Kind=Kind;
    this.Lots=Lots;
    this.Singers=Singers;
    this.Title=Title;}
    
    
    
}

main

public static void main(String[] args) {
       
       VideoClub v1 = new VideoClub("1","2","3");
       VideoClub v2 = new VideoClub();
       VideoClub v3 = new VideoClub();
        
       System.out.println(v1.toString());
    }
  • Απαντ. 36
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσ.

Φίλε, διάβασε κανά πρόγραμμα Java να δεις πως τα γράφουνε και ακολούθησε την ίδια λογική.

Ξαναγάψε τον κωδικά σου και μετά τα ξαναλέμε.

Εδώ έχει μαζεμένα όλα όσα πρέπει να ακολουθήσεις. Αν δεν έχεις χρόνο να το διαβάσεις, δες κανένα πρόγραμμα από oracle.

http://www.oracle.com/technetwork/java/javase/documentation/codeconvtoc-136057.html

  • Like 1
Δημοσ.

Η κληρονομικότητα και ο πολυμορφισμός ξέρεις τι είναι; Με βάση τον κώδικα που έχεις παραθέσει μου δίνεις την αίσθηση ότι δεν έχεις καμία απολύτως ιδέα τι να κάνεις.

 

Η εκφώνηση σου λέει να χρησιμοποιήσεις abstract class. Τα DVD και τα CD έχουν κάποια κοινά στοιχεία. Code, Title, Genre(όχι Kind), Copies (διαέσιμα κομμάτια). Έχουν επίσης εξειδικευμένα στοιχεία (actors, singers, ημερομηνία παραγωγής, κόστος ενοικίασης κτλ). 

 

Οπότε θα έχεις ένα Abstract Class Media ξέρω γω και 2 Subclass DVD και CD τα οποία θα το κάνουν extend.

 

Επίσης έχεις πεδία Singers, Actors κτλ...αν δεχτούμε ότι θέλουμε μόνο τα ονόματά τους τότε θα τους καταχωρήσεις ως String..αλλά επειδή είναι πολλοί πως θα γίνει; Άρα πρέπει να έχεις private ArrayList<String> singers;

 

To rate σου (το κόστος ενοικίασης είναι κοινό για όλα τα subclass). Αρα το κάθε subclass σου θα έχει ένα constant: public static final double RATE = 1.5;  και 2.0 αντίστοιχα για το DVD.

(εδώ αν θέλεις να παίξεις με κληρονομικότητα μπορείς απλά να κάνεις public static final RATE και μετά στο κάθε subclass να κάνει static initialization: static { RATE = 1.5; } αλλά δεν το θεωρώ απαραίτητο).

 

To Videoclub σου θα έχει μια συλλογή απο Media (CD+DVD) (στο λέει κιολας) ή όπως ονομάσεις το Superclass σου. Αυτό μπορεί να είναι ένα private ArrayList<Media> database. Λόγω του πολυμορφισμού εκεί μπορείς να προσθέσεις και CD και DVD.

 

Κάντα αυτά και βλέπουμε πως θα κάνεις ενοικιάσεις και επιστροφές.

 

EDIT: Βλέπω ότι θεωρεί ότι έχουμε μόνο 1 Κόπια απο το καθένα. Σε αυτή τη περίπτωση απλά θα έχεις ένα Boolean flag το οποίο θα είναι true όταν είναι νοικιασμένο και false όταν δεν είναι.

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

Η κληρονομικότητα και ο πολυμορφισμός ξέρεις τι είναι; Με βάση τον κώδικα που έχεις παραθέσει μου δίνεις την αίσθηση ότι δεν έχεις καμία απολύτως ιδέα τι να κάνεις.

 

Η εκφώνηση σου λέει να χρησιμοποιήσεις abstract class. Τα DVD και τα CD έχουν κάποια κοινά στοιχεία. Code, Title, Genre(όχι Kind), Copies (διαέσιμα κομμάτια). Έχουν επίσης εξειδικευμένα στοιχεία (actors, singers, ημερομηνία παραγωγής, κόστος ενοικίασης κτλ). 

 

Οπότε θα έχεις ένα Abstract Class Media ξέρω γω και 2 Subclass DVD και CD τα οποία θα το κάνουν extend.

 

Επίσης έχεις πεδία Singers, Actors κτλ...αν δεχτούμε ότι θέλουμε μόνο τα ονόματά τους τότε θα τους καταχωρήσεις ως String..αλλά επειδή είναι πολλοί πως θα γίνει; Άρα πρέπει να έχεις private ArrayList<String> singers;

 

To rate σου (το κόστος ενοικίασης είναι κοινό για όλα τα subclass). Αρα το κάθε subclass σου θα έχει ένα constant: public static final double RATE = 1.5;  και 2.0 αντίστοιχα για το DVD.

(εδώ αν θέλεις να παίξεις με κληρονομικότητα μπορείς απλά να κάνεις public static final RATE και μετά στο κάθε subclass να κάνει static initialization: static { RATE = 1.5; } αλλά δεν το θεωρώ απαραίτητο).

 

To Videoclub σου θα έχει μια συλλογή απο Media (CD+DVD) (στο λέει κιολας) ή όπως ονομάσεις το Superclass σου. Αυτό μπορεί να είναι ένα private ArrayList<Media> database. Λόγω του πολυμορφισμού εκεί μπορείς να προσθέσεις και CD και DVD.

 

Κάντα αυτά και βλέπουμε πως θα κάνεις ενοικιάσεις και επιστροφές.

 

EDIT: Βλέπω ότι θεωρεί ότι έχουμε μόνο 1 Κόπια απο το καθένα. Σε αυτή τη περίπτωση απλά θα έχεις ένα Boolean flag το οποίο θα είναι true όταν είναι νοικιασμένο και false όταν δεν είναι.

ευχαριστώ πολύ κατάλαβα πάνω κάτω τι να κάνω.

οι αλλαγές

main

 public static void main(String[] args) {
       
       VideoClub v1 = new VideoClub("1","2","3");
       CD a = new CD("1","2","3","4","5","6");
       v1.addMultiMedia(a);
       System.out.println(v1.toString());
       System.out.println(a.toString());
    } 

multimedia

public abstract class MultiMedia {
    protected String code,title,genre,dateProduce;
    
    
    public MultiMedia(String code, String title,String genre,String dateProduce){
    this.code=code;
    this.dateProduce=dateProduce;
    this.genre=genre;
    this.title=title;
    }
    
    public abstract double charge(int days);
    
    public String toString(){
    return "Kodikos  "+this.code+" Imerominia Paragogis "+this.dateProduce+" eidos "+this.genre+" Titlos "+this.title;    }
    
} 

CD

public class CD extends MultiMedia{
    private String copies;
    private String singers ; /// na to kano arraylsit gia tragoudistes kai sto dvd ithopious
    public static final double RATE = 1.5;
    
    public CD(String code, String title,String genre,String dateProduce,String copies, String singers){
    super(code,title,genre,dateProduce);
    this.copies = copies;
    this.singers=singers;
}
    
    public double charge(int days){
        return RATE*days;
    }
    
    public String toString(){
      return "CD :"+super.toString()+" Plithos komation "+this.code+" Tragoudistis "+this.singers;
    }
} 

DVD

public class DVD extends MultiMedia{
    private String actors; /// array lis na gini
    public static final double RATE = 2;
    
    public DVD(String code, String title,String genre,String dateProduce,String actors){
    super(code,title,genre,dateProduce);
    this.actors=actors;
    }
    
    public double charge(int days){
        return RATE*days;
    }
    
     public String toString(){
      return "DVD :"+super.toString()+" Ithopoioi "+this.actors;
    }
}

videoClub

public class VideoClub {
    
    private String Adress,Telephone,Timeclock;
    private ArrayList <MultiMedia> database;
    
    public VideoClub(String Adress, String Telephone, String Timeclock){
    this.Adress=Adress;
    this.Telephone=Telephone;
    this.Timeclock=Timeclock;
    database = new ArrayList <MultiMedia>();
    }
    
    public void addMultiMedia(MultiMedia obj){
    database.add(obj);
    }
    
    public String toString(){
    return "I dieuthinsi tou videoClub einai "+this.Adress+" To tilephono einai "+this.Telephone+" Orologio programa "+this.Timeclock;    }
    
    
} 

.

Επεξ/σία από VagosM
Δημοσ.



public abstract class MultiMedia {
protected String code, title, genre, dateProduce; /* kanto private kai vres lisi kai apostaseis, min ta kolas. Eidika otan ine etsi polla kai diaforetika kalitera kathe ena ksexorista se diki tou grammi kai dipla ena sxolio ti ine to kathe ena*/


public MultiMedia(String code, String title, String genre, String dateProduce){
this.code = code; /**des kai tis alles sou stixisis */
this.dateProduce = dateProduce;
this.genre = genre;
this.title = title;
}

public abstract double charge(int days);

public String toString(){
return "Kodikos "+this.code+" Imerominia Paragogis "+this.dateProduce+" eidos "+this.genre+" Titlos "+this.title; }

 

Δημοσ.

Σωστά τα variables στο superclass πρέπει να είναι protected, για να μπορούν τα Subclass να τα βλέπουν.

 

Επίσης δυο παρατηρήσεις, κάνε τα Singers/Actors ΑrrayList, άλλωστε το έχεις ο ίδιος σε comment. Με το copies εγώ εννοούσα διαθέσιμα κομμάτια για ενοικίαση. Εσύ έτσι όπως το έχεις προφανώς εννοείς αριθμός τραγουδιών στο CD, οπότε αλλαξέ το ξέρω γω σε numSongs  για να είναι πιο ακριβές.

Θέλεις και ένα variable στο MultiMedia, protected boolean rented; για να δηλώνεις αν είναι νοικιασμένο ή όχι.

 

Επίσης θέλεις κάποια getters/setters, εκεί που θεωρείς απαραίτητο (π.χ. σίγουρα το rented θα θέλει getter/setter).

 

Οπότε τώρα θα κάνεις μια μέθοδο που θα κάνει Loop to Multimedia ArrayList και θα κάνει

if (database.get(i).getRented == true) 
       System.out.println(database.get(i).toString());

Για να δεις ποιές είναι νοικιασμένες.

 

Και να θυμάσαι τη στοίχιση ;)

  • Like 1
Δημοσ.

Σωστά τα variables στο superclass πρέπει να είναι protected, για να μπορούν τα Subclass να τα βλέπουν.

 

Μεγάλο λάθος να φαίνονται τα fields ενός class. 

Με τις αντίστοιχες μεθόδους έχεις πρόσβαση εκεί που θες...

 

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

Δημοσ.

Σωστά τα variables στο superclass πρέπει να είναι protected, για να μπορούν τα Subclass να τα βλέπουν.

 

Επίσης δυο παρατηρήσεις, κάνε τα Singers/Actors ΑrrayList, άλλωστε το έχεις ο ίδιος σε comment. Με το copies εγώ εννοούσα διαθέσιμα κομμάτια για ενοικίαση. Εσύ έτσι όπως το έχεις προφανώς εννοείς αριθμός τραγουδιών στο CD, οπότε αλλαξέ το ξέρω γω σε numSongs  για να είναι πιο ακριβές.

Θέλεις και ένα variable στο MultiMedia, protected boolean rented; για να δηλώνεις αν είναι νοικιασμένο ή όχι.

 

Επίσης θέλεις κάποια getters/setters, εκεί που θεωρείς απαραίτητο (π.χ. σίγουρα το rented θα θέλει getter/setter).

 

Οπότε τώρα θα κάνεις μια μέθοδο που θα κάνει Loop to Multimedia ArrayList και θα κάνει

if (database.get(i).getRented == true) 
       System.out.println(database.get(i).toString());

Για να δεις ποιές είναι νοικιασμένες.

 

Και να θυμάσαι τη στοίχιση ;)

 

Πιστεύω είμαι κοντά στο να τελειώσει , έχω ένα θεματικά με το rend .

 

Main

public static void main(String[] args) {
       boolean flag=true;
       String names,y; 
       
       Scanner in = new Scanner(System.in);
       
       VideoClub v1 = new VideoClub("1","2","3");
       CD a = new CD("1","2","3","4","5");
       
       while(flag==true){
        System.out.println("Please give name of singers of CD");
        names=in.nextLine();
        a.addSingers(names);
        System.out.println("if singers end prees y");
        y=in.nextLine();
        if(y.equals("y"))
            flag=false;
       }
       
       if(a.getRend()==false);
       System.out.println("Is not rende");
       
       a.setRend(true);
       
       if(a.getRend()==true);
       System.out.println("Is  rende");
       
       v1.addMultiMedia(a);
       System.out.println(v1.toString());
       System.out.println(a.toString());
    }
}

Multimedia

public abstract class MultiMedia {
    protected String code,title,genre,dateProduce;
    protected boolean rend=false;
    
    public MultiMedia(String code, String title,String genre,String dateProduce){
    this.code=code;
    this.dateProduce=dateProduce;
    this.genre=genre;
    this.title=title;
    }
    public void setRend(boolean rend){this.rend=rend;}
    public boolean getRend(){return rend;}
    
   
   
    
    public abstract double charge(int days);
    
    public String toString(){
    return "Kodikos  "+this.code+" Imerominia Paragogis "+this.dateProduce+" eidos "+this.genre+" Titlos "+this.title;    }
    
}

CD

public class CD extends MultiMedia{
    private String copies;
    private static ArrayList <String> singers ; /// na to kano arraylsit gia tragoudistes kai sto dvd ithopious
    public static final double RATE = 1.5;
    
    public CD(String code, String title,String genre,String dateProduce,String copies){
    super(code,title,genre,dateProduce);
    this.copies = copies;
    singers = new ArrayList <String>();
}
    public void addSingers(String s){
    singers.add(s);
    }
    
     static ArrayList<String> getSingers() {
        return singers;
    }

    public static ArrayList<String> viewSingers() {
       return getSingers();
    }
    
    public double charge(int days){
        return RATE*days;
    }
    
    
    public String toString(){
      return "CD :"+super.toString()+" Plithos komation "+this.code+" Tragoudistis "+viewSingers();
    }
} 

videoclub

public class VideoClub {
    
    private String Adress,Telephone,Timeclock;
    private ArrayList <MultiMedia> database;
    
    public VideoClub(String Adress, String Telephone, String Timeclock){
    this.Adress=Adress;
    this.Telephone=Telephone;
    this.Timeclock=Timeclock;
    database = new ArrayList <MultiMedia>();
    }
    
    public void addMultiMedia(MultiMedia obj){
    database.add(obj);
    }
    
     public void rends(){
         int i=0;
       if (database.get(i).getRend() == true) 
       System.out.println(database.get(i).toString());
}
    
    
    public String toString(){
    return "I dieuthinsi tou videoClub einai "+this.Adress+" To tilephono einai "+this.Telephone+" Orologio programa "+this.Timeclock;    }
    
    
} 

DVD

public class DVD extends MultiMedia{
    private static ArrayList <String> actors; /// array lis na gini
    public static final double RATE = 2;
    
    public DVD(String code, String title,String genre,String dateProduce){
    super(code,title,genre,dateProduce);
    actors = new ArrayList<String>();
    }
    
    public void addActos(String s){
    actors.add(s);
    }
    
     static ArrayList<String> getActors() {
        return actors;
    }

    public static ArrayList<String> viewActors() {
       return getActors();
    }
    
    public double charge(int days){
        return RATE*days;
    }
    
     public String toString(){
      return "DVD :"+super.toString()+" Ithopoioi "+viewActors();
    }
}
Δημοσ.

Μεγάλο λάθος να φαίνονται τα fields ενός class. 

Με τις αντίστοιχες μεθόδους έχεις πρόσβαση εκεί που θες...

 

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

 

Απο το link σου "Use the most restrictive access level that makes sense for a particular member. Use private unless you have a good reason not to."

Αν makes sense λοιπόν να αφήσεις πρόσβαση σε ένα subclass με protected το κάνεις, αν δεν makes sense δεν το κάνεις. Γενικότερα αν κάνει make sense να αφήσεις κάτι public το κάνεις...όπως π.χ. τα constants τα οποίο έτσι κ αλλιώς δεν αλλάζουν.

Δημοσ.

Απο το link σου "Use the most restrictive access level that makes sense for a particular member. Use private unless you have a good reason not to."

Αν makes sense λοιπόν να αφήσεις πρόσβαση σε ένα subclass με protected το κάνεις, αν δεν makes sense δεν το κάνεις. Γενικότερα αν κάνει make sense να αφήσεις κάτι public το κάνεις...όπως π.χ. τα constants τα οποίο έτσι κ αλλιώς δεν αλλάζουν.

  • Use the most restrictive access level that makes sense for a particular member. Use private unless you have a good reason not to.

Δώσε μου έναν καλό λόγο να μη χρησιμοποιήσω private. 

 

protected σημαίνει πως έχουν πρόσβαση όλοι όσοι είναι στι ίδιο πακέτο και όλες οι subclasses. Ποτέ δεν αφήνεις ακάλυπτα τα fields σου. Βασικός κανόνας object oriented programming. Για αυτό το λόγο υπάρχουν οι μέθοδοι getters και setters. Ψάξ'το λίγο και θα καταλάβεις...

Δημοσ.

 

  • Use the most restrictive access level that makes sense for a particular member. Use private unless you have a good reason not to.

Δώσε μου έναν καλό λόγο να μη χρησιμοποιήσω private. 

 

protected σημαίνει πως έχουν πρόσβαση όλοι όσοι είναι στι ίδιο πακέτο και όλες οι subclasses. Ποτέ δεν αφήνεις ακάλυπτα τα fields σου. Βασικός κανόνας object oriented programming. Για αυτό το λόγο υπάρχουν οι μέθοδοι getters και setters. Ψάξ'το λίγο και θα καταλάβεις...

 

 

Για να είναι πιο readable ο κώδικας. Στο ίδιο package συνήθως θα έχεις αρκετά class τα οποία  λογικά θα είναι σχετικά μεταξύ τους και θα τα έχεις δημιουργήσει ο ίδιος. Άρα δεν υπάρχει ιδιαίτερος λόγος να κρύψεις το implementation σου

Επίσης γενικότερα αν δεν υπάρχουν "ελεγκτικοί μηχανισμοί" στα getter/setter δεν κερδίζεις και τίποτα το ιδιαίτερο. Ιδιαίτερα όταν θα κάνεις public setter χωρίς κανέναν ελεγκτικό μηχανισμό...απλά κάνεις μια τρύπα στο νερό.

 

Καλό είναι αν είσαι αρχάριος το "παντα private" και "παντα getters/setters", αλλά όταν αρχίζεις και καταλαβαίνεις για ποιο λόγο κάνεις ότι κάνεις παίρνεις τις αποφάσεις σου για συγκεκριμένους λόγους.

Τώρα εσύ πες μου έναν καλό λόγο να μην έχω ένα Constant ως public

Δημοσ.

Για να είναι πιο readable ο κώδικας. Στο ίδιο package συνήθως θα έχεις αρκετά class τα οποία  λογικά θα είναι σχετικά μεταξύ τους και θα τα έχεις δημιουργήσει ο ίδιος. Άρα δεν υπάρχει ιδιαίτερος λόγος να κρύψεις το implementation σου

Επίσης γενικότερα αν δεν υπάρχουν "ελεγκτικοί μηχανισμοί" στα getter/setter δεν κερδίζεις και τίποτα το ιδιαίτερο. Ιδιαίτερα όταν θα κάνεις public setter χωρίς κανέναν ελεγκτικό μηχανισμό...απλά κάνεις μια τρύπα στο νερό.

 

Καλό είναι αν είσαι αρχάριος το "παντα private" και "παντα getters/setters", αλλά όταν αρχίζεις και καταλαβαίνεις για ποιο λόγο κάνεις ότι κάνεις παίρνεις τις αποφάσεις σου για συγκεκριμένους λόγους.

Τώρα εσύ πες μου έναν καλό λόγο να μην έχω ένα Constant ως public

Μάλιστα, το private είναι για τους αρχάριους, thanks. Πάντα είναι καλό να μαθαίνεις νέα πράγματα...

Δημοσ.

Μάλιστα, το private είναι για τους αρχάριους, thanks...

 

Θα μας πεις τώρα για ποιό λόγο να έχεις ένα constant private ή έστω τι κερδίζεις όταν έχεις public getters/setters οι οποίοι μόνο σου αλλάζουν και σου επιστρέφουν τη τιμή, χωρίς κανέναν ελεγκτικό μηχανισμό;

Δημοσ.

Θα μας πεις τώρα για ποιό λόγο να έχεις ένα constant private ή έστω τι κερδίζεις όταν έχεις public getters/setters οι οποίοι μόνο σου αλλάζουν και σου επιστρέφουν τη τιμή, χωρίς κανέναν ελεγκτικό μηχανισμό;

 

Ψάξε για loose coupling.

 

Για το constant, δεν έχω αντίρρηση, η επισήμανση μου ήταν για τα protected fields που έχει στον κωδικά του ο ts.

Δημοσ.

Το αν ειναι constant δεν εχει καμια σχέση με το visibility.

Υπάρχουν private constants οι οποιες ειναι implementation detail της κλασης και δεν εχει νόημα να της γνωρίζει o caller (αυτος που χρησιμοποιει την κλαση).

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα

  • Δημιουργία νέου...