Φωτογραφία Φοίβος Καραλής
toString() ξανά
από Φοίβος Καραλής - Saturday, 17 December 2011, 4:48 PM
 
Καλησπέρα Νίκο,
Εφόσον στην έξοδο δεν υπάρχει κάτι εξειδικευμένο για κάποια υποκλάση, γιατί να μην παράγεται ολόκληρη από την υλοποίηση της toString στην Employee έτσι ώστε αυτή να παραληφθεί από τις υποκλάσεις;
 
Φωτογραφία Νικόλαος Πανάγος
Απάντηση: toString() ξανά
από Νικόλαος Πανάγος - Saturday, 17 December 2011, 4:54 PM
 
Φοίβο καλησπέρα,

για να είμαι ειλικρινής δεν κατάλαβα την ερώτησή σου. Το ζητούμενο είναι αν καλέσω την toString() της HourlyEmployee να μου επιστρέψει "HourlyEmployee" και αν καλέσω την toString() της SalaryEmployee να μου επιστρέψει "SalaryEmployee". Πως θα μπορούσε να γίνει αυτό στην Employee;
Γιατί σας έχει δημιουργήσει τόσες πολλές απορίες μια τόσο απλή μεθοδος;
Φωτογραφία Φοίβος Καραλής
Re: Απάντηση: toString() ξανά
από Φοίβος Καραλής - Saturday, 17 December 2011, 6:37 PM
 
Η ερώτηση αφορά σε εναλλακτική υλοποίηση προς το πολυμορφικότερον, όχι στη μέθοδο καθεαυτή. Μπορεί να καλείται η toString() της Employee και εκεί να καλούνται με τη σειρά τους μέθοδοι που υλοποιούνται ανάλογα με την υποκλάση της οποίας στιγμιότυπο είναι το εκάστοτε αντικείμενο. Ρώτησα λοιπόν αν δεν θα ήταν προτιμότερο κάτι τέτοιο εφόσον επιθυμούμε λιγότερο κώδικα (επιτυγχάνεται μέσω της παράλειψης της toString() από τις υποκλάσεις) και ευκολότερα συντηρήσιμο (αφού έχουμε να κάνουμε με ένα σημείο κώδικα στην υπερκλάση και μόνο).
Φωτογραφία Νικόλαος Πανάγος
Απάντηση: Re: Απάντηση: toString() ξανά
από Νικόλαος Πανάγος - Saturday, 17 December 2011, 6:38 PM
 
Φοίβο εξακολουθώ να μην καταλαβαίνω την ερώτησή σου. Εάν δεν υπάρχουν υπερκαλυπτόμενες μέθοδοι δεν υπάρχει πολυμορφισμός. Αν θέλεις στείλε μου ένα κομμάτι κώδικα για να καταλάβω τι ακριβώς εννοείς.
Φωτογραφία Φοίβος Καραλής
Re: Απάντηση: Re: Απάντηση: toString() ξανά
από Φοίβος Καραλής - Saturday, 17 December 2011, 7:12 PM
 
toString() μόνο στην Employee:

return String.format("%s %s: %,.1f Ευρώ\n",
getClass().getName(), getSurname(), pay());


Στη main τα αντικείμενα δηλώνονται ως εξής
Employee h = new HourlyEmployee..

και το h.toString() παράγει το επιθυμητό απoτέλεσμα (εκτός απ'το οτι εμφανίζεται κ το πακέτο της κλάσης)
Φωτογραφία Νικόλαος Πανάγος
Απάντηση: Re: Απάντηση: Re: Απάντηση: toString() ξανά
από Νικόλαος Πανάγος - Saturday, 17 December 2011, 7:49 PM
 
ΟΚ, τώρα κατάλαβα τι εννοούσες.
Κατ' αρχήν η toString() θα πρέπει να επιστέφει μόνο το όνομα της κλάσης αλλά αυτό δεν είναι το θέμα μας.
Ο κώδικάς σου δουλεύει επειδή μέσα στην υλοποίηση της toString() στην Employee καλεί αποκλειστικά υπερκαλυπτόμενες μεθόδους όπως η getClass(). Δοκίμασε τώρα να σβήσεις αυτό που έχεις γράψει στο σώμα της toString() της Employee και αντικατάστησέ το με κάτι τέτοιο: return "Employee";

Αν ξανατρέξεις τον κώδικά σου με αυτήν την αλλαγή θα διαπιστώσεις πως δε θα πάρεις το επιθυμητό αποτέλεσμα.
Φωτογραφία Φοίβος Καραλής
Re: Απάντηση: Re: Απάντηση: Re: Απάντηση: toString() ξανά
από Φοίβος Καραλής - Sunday, 18 December 2011, 4:26 PM
 
Καλησπέρα κ πάλι. Καταρχήν διευκρινίζω οτι το παραδοτέο μου είναι εναρμονισμένο με τις απαιτήσεις της άσκησης (προσπαθώ, τουλάχιστον).

Όσο αφορά την κουβέντα μας εννοείς

public String toString() { return "Employee"; }
??

Εμφανίζει
Employee
Employee

ότι δηλ περιμένουμε. Πραγματικά δεν καταλαβαίνω, ο τρόπος που προτείνω δεν θα έπρεπε να δουλεύει, ή δεν είναι πολυμορφικός ή είναι κακή πρακτική ??help
Φωτογραφία Νικόλαος Πανάγος
Απάντηση: Re: Απάντηση: Re: Απάντηση: Re: Απάντηση: toString() ξανά
από Νικόλαος Πανάγος - Sunday, 18 December 2011, 5:18 PM
 
Φοίβο αν ορίσεις την toString() μέσα στην Employee μόνο και την υλοποιήσεις όπως σου είπα, δε θα πάρεις σωστή έξοδο αν την καλέσεις μέσω αντικειμενου παράγωγης κλάσης. Θα πάρεις όπως είπες Employee. Αυτό δεν είναι πολυμορφικό.

Φωτογραφία Φοίβος Καραλής
Re: Απάντηση: Re: Απάντηση: Re: Απάντηση: Re: Απάντηση: toString() ξανά
από Φοίβος Καραλής - Sunday, 18 December 2011, 5:36 PM
 
Οκ, νομίζω.
Αλλά το να επιδιώκουμε πολυμόρφικότητα με την pay() που για κάθε υποκλάση υπολογίζεται διαφορετικά το καταλαβαίνω. Πρέπει οπωσδήποτε να έχουμε και με την toString(); Αφού δουλεύει και αλλιώς, και με οικονομία σε κώδικα και με ένα σημειό κώδικα για συντήρηση αντί για δύο.
Φωτογραφία Νικόλαος Πανάγος
Απάντηση: Re: Απάντηση: Re: Απάντηση: Re: Απάντηση: Re: Απάντηση: toString() ξανά
από Νικόλαος Πανάγος - Sunday, 18 December 2011, 6:25 PM
 
Το ίδιο προσπαθώ να κάνω και με την toString(), από τα πιο βασικά σημεία της ενότητας είναι ο πολυμορφισμός και ήθελα να τον δείτε στην πράξη, αυτό είναι το όλο σκεπτικό.
Ενδεχομένως τα επιχειρήματά μου να μη σε πείθουν και είναι θεμιτό, όπως κι εγώ δεν πείθομαι από τα δικά σου κι εξακολουθώ να πιστεύω πως το συγκεκριμένο σχέδιο είναι σαφώς καλύτερο. Το ίδιο πιστεύουν και οι δημιουργοί της Java, γι αυτό τοποθέτησαν την toString() στην Object, ώστε να την υπερκαλύπτουμε κατά βούληση σε όποια υποκλάση θέλουμε και να επιστρέφει πληροφορίες σχετικά με αυτήν.