java:generic_interface_example
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| java:generic_interface_example [2016/04/14 15:18] – [Εισάγοντας μία νέα κλάση που υλοποιεί το Interface] gthanos | java:generic_interface_example [2020/02/25 09:34] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Παράδειγμα | + | ====== Παράδειγμα |
| - | Ας επανέλθουμε στο παράδειγμα [[java:interfaces# | + | Ας επανέλθουμε στο παράδειγμα [[java:interface_as_data_type|χρήσης των interfaces ως τύπους δεδομένων]] και ας αλλάξουμε ελαφρά το interface MyComparable ώστε να περιέχει και την μέθοδο isEqual που ελέγχει την ισότητα. |
| <code java MyComparable.java> | <code java MyComparable.java> | ||
| Line 18: | Line 18: | ||
| και είναι απαραίτητη ώστε να σηματοδοτήσουμε την πιθανή σύγκριση ασύμβατων μεταξύ τους τύπων δεδομένων. | και είναι απαραίτητη ώστε να σηματοδοτήσουμε την πιθανή σύγκριση ασύμβατων μεταξύ τους τύπων δεδομένων. | ||
| - | Στη συνέχεια κατασκευάζουμε την κλάση Rectangle που υλοποιεί το συγκεκριμένο interface | + | Στη συνέχεια κατασκευάζουμε την κλάση Rectangle που υλοποιεί το συγκεκριμένο interface: |
| <code java Rectangle.java> | <code java Rectangle.java> | ||
| Line 90: | Line 90: | ||
| </ | </ | ||
| - | Παρατηρήστε ότι υλοποιούμε το interface MyComparable συγκρίνοντας τα αντικείμενου τύπου Rectangle με βάση το εμβαδόν τους. Επιπλέον | + | Παρατηρήστε ότι υλοποιούμε το //interface MyComparable// συγκρίνοντας τα αντικείμενου τύπου Rectangle |
| <code java MyComparableUtil.java> | <code java MyComparableUtil.java> | ||
| Line 117: | Line 117: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | Τέλος η κλάση // | ||
| <code java CompareObjects.java> | <code java CompareObjects.java> | ||
| Line 135: | Line 137: | ||
| - | Ας υποθέσουμε τώρα ότι θέλετε να φτιάξετε την κλάση Circle | + | Ας υποθέσουμε τώρα ότι θέλετε να φτιάξετε την κλάση |
| <code java Circle.java> | <code java Circle.java> | ||
| Line 187: | Line 189: | ||
| </ | </ | ||
| - | Αν αναδιαμορφώσουμε την // | + | Ας προσπαθήσουμε |
| <code java CompareObjects.java> | <code java CompareObjects.java> | ||
| Line 205: | Line 207: | ||
| </ | </ | ||
| - | παρατηρούμε ότι η παραπάνω κλάση μεταγλωττίζεται, | + | Παρατηρούμε ότι η παραπάνω κλάση μεταγλωττίζεται, |
| + | |||
| + | Προκειμένου να μπορούμε να συγκρίνουμε | ||
| <code java TwoDShape.java> | <code java TwoDShape.java> | ||
| Line 237: | Line 241: | ||
| </ | </ | ||
| - | <WRAP important | + | <WRAP important |
| Παρατηρήστε τα εξής: | Παρατηρήστε τα εξής: | ||
| - Η μέθοδος isLarger για τα διδιάστατα σχήματα βασίζεται στη μέθοδο getArea(). Η μέθοδος getArea() ορίζεται στην κλάση TwoDShape, αλλά η υλοποίηση της εξαρτάται από το εκάστοτε διδιάστατο σχήμα. Κατά συνέπεια, | - Η μέθοδος isLarger για τα διδιάστατα σχήματα βασίζεται στη μέθοδο getArea(). Η μέθοδος getArea() ορίζεται στην κλάση TwoDShape, αλλά η υλοποίηση της εξαρτάται από το εκάστοτε διδιάστατο σχήμα. Κατά συνέπεια, | ||
| - | - H μέθοδος isLarger συγκρίνει τα διδιάστατα σχήματα με βάση το εμβαδό τους. Προκειμένου κάποια υποκλάση να μην επαναορίσει την μέθοδο isLarger με τρόπου που δεν είναι επιθυμητός, | + | - H μέθοδος isLarger συγκρίνει τα διδιάστατα σχήματα με βάση το εμβαδό τους. Προκειμένου κάποια υποκλάση να μην επαναορίσει την μέθοδο isLarger με τρόπο που δεν είναι επιθυμητός, |
| </ | </ | ||
| Line 392: | Line 396: | ||
| </ | </ | ||
| - | Ας υποθέσουμε τώρα ότι επιχειρούμε να μεταγλωττίσουμε και να τρέξουμε | + | Ας υποθέσουμε τώρα ότι επιχειρούμε συγκρίνουμε ένα διδιάστατο με ένα τρισδιάστατο σχήμα. Μεταβάλλουμε κατάληλλα την κλάση // |
| <code java CompareObjects.java> | <code java CompareObjects.java> | ||
| Line 402: | Line 406: | ||
| Cuboid cuboid = new Cuboid(rect, | Cuboid cuboid = new Cuboid(rect, | ||
| | | ||
| - | System.out.println(" | + | System.out.println(" |
| } catch(InvalidComparableTypeException ex) { | } catch(InvalidComparableTypeException ex) { | ||
| System.err.println(" | System.err.println(" | ||
| Line 410: | Line 414: | ||
| </ | </ | ||
| - | < | + | Ο παρακάτω κώδικας |
| - | Ο παρακάτω κώδικας | + | |
| - | Η λύση στο πρόβλημα είναι η χρήση παραμετρικών τύπων δεδομένων (generics). __Οι παραμετρικοί τύποι δεδομένων έχουν την δυνατότητα να αντιλαμβάνονται ασυμβατότητες τύπων δεδομένων κατά την εκτέλεση και όχι κατά την | + | Η λύση στο πρόβλημα είναι η χρήση παραμετρικών τύπων δεδομένων (generics). __Οι παραμετρικοί τύποι δεδομένων έχουν την δυνατότητα να αντιλαμβάνονται ασυμβατότητες τύπων δεδομένων κατά την |
| + | |||
| + | ===== Χρήση Generics για το προηγούμενο παράδειγμα ===== | ||
| <code java MyComparable.java> | <code java MyComparable.java> | ||
| Line 419: | Line 424: | ||
| public interface MyComparable< | public interface MyComparable< | ||
| public boolean isLarger(T other); | public boolean isLarger(T other); | ||
| + | public boolean isEqual(T other); | ||
| } | } | ||
| </ | </ | ||
| Line 433: | Line 439: | ||
| | | ||
| public final boolean isEqual(TwoDShape other) { | public final boolean isEqual(TwoDShape other) { | ||
| - | if( this.getArea() | + | if( this.getArea() |
| return true; | return true; | ||
| else | else | ||
| Line 454: | Line 460: | ||
| | | ||
| public final boolean isEqual(ThreeDShape other) { | public final boolean isEqual(ThreeDShape other) { | ||
| - | if( this.getArea() | + | if( this.getArea() |
| return true; | return true; | ||
| else | else | ||
| Line 471: | Line 477: | ||
| if (object1.isLarger(object2)) | if (object1.isLarger(object2)) | ||
| return object1; | return object1; | ||
| + | else if (object1.isEqual(object2)) | ||
| + | return null; | ||
| else | else | ||
| return object2; | return object2; | ||
| Line 478: | Line 486: | ||
| if (!(object1.isLarger(object2))) | if (!(object1.isLarger(object2))) | ||
| return object1; | return object1; | ||
| + | else if (object1.isEqual(object2)) | ||
| + | return null; | ||
| else | else | ||
| return object2; | return object2; | ||
| Line 485: | Line 495: | ||
| <WRAP important 80% center round> | <WRAP important 80% center round> | ||
| - | Παρατηρήστε | + | Παρατηρήστε τα εξής: |
| + | - Δεν έχει νόημα η παραγωγή του InvalidComparableTypeException, | ||
| + | - Δεν είναι δυνατόν να ορίσετε την κλάση // | ||
| </ | </ | ||
| - | Αν προσπαθήσετε να μεταγλωττίσετε την CompareObjects θα δείτε ότι είναι αδύνατον να το κάνετε. | + | Προσαρμόζουμε κατάλληλα την κλάση // |
| <code java CompareObjects.java> | <code java CompareObjects.java> | ||
| public class CompareObjects { | public class CompareObjects { | ||
| public static void main (String []args) { | public static void main (String []args) { | ||
| - | | + | Point p = new Point(1, |
| - | | + | Rectangle rect = new Rectangle(10, |
| - | Rectangle rect = new Rectangle(10, | + | Cuboid cuboid = new Cuboid(rect, |
| - | Cuboid cuboid = new Cuboid(rect, | + | |
| | | ||
| - | | + | MyComparableUtil< |
| - | } catch(InvalidComparableTypeException ex) { | + | |
| - | System.err.println(" | + | |
| - | } | + | |
| } | } | ||
| } | } | ||
| </ | </ | ||
| + | Το μήνυμα που εμφανίζει ο compiler είναι το παρακάτω | ||
| + | <code txt compiler-error.txt> | ||
| + | CompareObjects.java: | ||
| + | System.out.println(" | ||
| + | ^ | ||
| + | required: TwoDShape, | ||
| + | found: Rectangle, | ||
| + | reason: actual argument Cuboid cannot be converted to TwoDShape by method invocation conversion | ||
| + | where T is a type-variable: | ||
| + | T extends MyComparable< | ||
| + | </ | ||
| - | + | | Προηγούμενο : [[ : | |
| - | + | ||
| - | + | ||
java/generic_interface_example.1460647091.txt.gz · Last modified: 2016/04/14 14:18 (external edit)
