VagosM Δημοσ. 3 Ιουλίου 2013 Δημοσ. 3 Ιουλίου 2013 Καλημέρα έχω να κάνω μια εργασία σε java η εκφώνηση και ο κώδικας που έγραψα δεν μπορώ να καταλάβω πως θα κάνω 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()); }
djcat Δημοσ. 3 Ιουλίου 2013 Δημοσ. 3 Ιουλίου 2013 Φίλε, διάβασε κανά πρόγραμμα Java να δεις πως τα γράφουνε και ακολούθησε την ίδια λογική. Ξαναγάψε τον κωδικά σου και μετά τα ξαναλέμε. Εδώ έχει μαζεμένα όλα όσα πρέπει να ακολουθήσεις. Αν δεν έχεις χρόνο να το διαβάσεις, δες κανένα πρόγραμμα από oracle. http://www.oracle.com/technetwork/java/javase/documentation/codeconvtoc-136057.html 1
ZAKKWYLDE Δημοσ. 3 Ιουλίου 2013 Δημοσ. 3 Ιουλίου 2013 Η κληρονομικότητα και ο πολυμορφισμός ξέρεις τι είναι; Με βάση τον κώδικα που έχεις παραθέσει μου δίνεις την αίσθηση ότι δεν έχεις καμία απολύτως ιδέα τι να κάνεις. Η εκφώνηση σου λέει να χρησιμοποιήσεις 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 όταν δεν είναι. 1
VagosM Δημοσ. 3 Ιουλίου 2013 Μέλος Δημοσ. 3 Ιουλίου 2013 (επεξεργασμένο) Η κληρονομικότητα και ο πολυμορφισμός ξέρεις τι είναι; Με βάση τον κώδικα που έχεις παραθέσει μου δίνεις την αίσθηση ότι δεν έχεις καμία απολύτως ιδέα τι να κάνεις. Η εκφώνηση σου λέει να χρησιμοποιήσεις 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; } } . Επεξ/σία 3 Ιουλίου 2013 από VagosM
djcat Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 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; } }
ZAKKWYLDE Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Σωστά τα 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()); Για να δεις ποιές είναι νοικιασμένες. Και να θυμάσαι τη στοίχιση 1
djcat Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Σωστά τα variables στο superclass πρέπει να είναι protected, για να μπορούν τα Subclass να τα βλέπουν. Μεγάλο λάθος να φαίνονται τα fields ενός class. Με τις αντίστοιχες μεθόδους έχεις πρόσβαση εκεί που θες... http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
VagosM Δημοσ. 4 Ιουλίου 2013 Μέλος Δημοσ. 4 Ιουλίου 2013 Σωστά τα 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(); } }
ZAKKWYLDE Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Μεγάλο λάθος να φαίνονται τα 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 τα οποίο έτσι κ αλλιώς δεν αλλάζουν.
djcat Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Απο το 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. Ψάξ'το λίγο και θα καταλάβεις...
ZAKKWYLDE Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 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
djcat Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Για να είναι πιο readable ο κώδικας. Στο ίδιο package συνήθως θα έχεις αρκετά class τα οποία λογικά θα είναι σχετικά μεταξύ τους και θα τα έχεις δημιουργήσει ο ίδιος. Άρα δεν υπάρχει ιδιαίτερος λόγος να κρύψεις το implementation σου Επίσης γενικότερα αν δεν υπάρχουν "ελεγκτικοί μηχανισμοί" στα getter/setter δεν κερδίζεις και τίποτα το ιδιαίτερο. Ιδιαίτερα όταν θα κάνεις public setter χωρίς κανέναν ελεγκτικό μηχανισμό...απλά κάνεις μια τρύπα στο νερό. Καλό είναι αν είσαι αρχάριος το "παντα private" και "παντα getters/setters", αλλά όταν αρχίζεις και καταλαβαίνεις για ποιο λόγο κάνεις ότι κάνεις παίρνεις τις αποφάσεις σου για συγκεκριμένους λόγους. Τώρα εσύ πες μου έναν καλό λόγο να μην έχω ένα Constant ως public Μάλιστα, το private είναι για τους αρχάριους, thanks. Πάντα είναι καλό να μαθαίνεις νέα πράγματα...
ZAKKWYLDE Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Μάλιστα, το private είναι για τους αρχάριους, thanks... Θα μας πεις τώρα για ποιό λόγο να έχεις ένα constant private ή έστω τι κερδίζεις όταν έχεις public getters/setters οι οποίοι μόνο σου αλλάζουν και σου επιστρέφουν τη τιμή, χωρίς κανέναν ελεγκτικό μηχανισμό;
djcat Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Θα μας πεις τώρα για ποιό λόγο να έχεις ένα constant private ή έστω τι κερδίζεις όταν έχεις public getters/setters οι οποίοι μόνο σου αλλάζουν και σου επιστρέφουν τη τιμή, χωρίς κανέναν ελεγκτικό μηχανισμό; Ψάξε για loose coupling. Για το constant, δεν έχω αντίρρηση, η επισήμανση μου ήταν για τα protected fields που έχει στον κωδικά του ο ts.
albNik Δημοσ. 4 Ιουλίου 2013 Δημοσ. 4 Ιουλίου 2013 Το αν ειναι constant δεν εχει καμια σχέση με το visibility. Υπάρχουν private constants οι οποιες ειναι implementation detail της κλασης και δεν εχει νόημα να της γνωρίζει o caller (αυτος που χρησιμοποιει την κλαση).
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα