java:interfaces

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision Both sides next revision
java:interfaces [2016/04/02 06:36]
gthanos [Χρησιμοποιώντας ένα interface ως τύπο δεδομένων]
java:interfaces [2016/04/09 06:45]
gthanos
Line 17: Line 17:
  
 Ως παράδειγμα,​ θεωρήστε ένα interface το οποίο ορίζει πως όποιοι κατασκευαστές συσκευών θέλουν να χρησιμοποιήσουν χρονόμετρο σε συσκευή τους πρέπει να υλοποιήσουν τις μεθόδους setTimer, startTimer και endTimer. ​ Ως παράδειγμα,​ θεωρήστε ένα interface το οποίο ορίζει πως όποιοι κατασκευαστές συσκευών θέλουν να χρησιμοποιήσουν χρονόμετρο σε συσκευή τους πρέπει να υλοποιήσουν τις μεθόδους setTimer, startTimer και endTimer. ​
-Ένας κατασκευαστής κλιματιστικών (που θέλει να μπορεί να σταματήσει η λειτουργία της συσκευής μετά από ένα χρονικό διάστημα),​ και ένας κατασκευαστής κουζινών (που θέλει η κουζίνα του να παράγει έναν ήχο μετά από ένα χρονικό διάστημα) επιλέγουν να υλοποιήσουν αυτές τις μεθόδους. Με αυτόν το τρόπο τηρούν ένα συμβόλαιο αλληλεπίδρασης με το χρονόμετρο. ​+Ένας κατασκευαστής κλιματιστικών (που θέλει να μπορεί να σταματήσει η λειτουργία της συσκευής μετά από ένα χρονικό διάστημα),​ και ένας κατασκευαστής κουζινών (που θέλει η κουζίνα του να παράγει έναν ήχο μετά από ένα χρονικό διάστημα) επιλέγουν να υλοποιήσουν αυτές τις μεθόδους. Με αυτόν το τρόπο τηρούν ένα συμβόλαιο αλληλεπίδρασης με το χρονόμετρο.
  
 Οι υλοποιήσεις για τις κουζίνες και τα κλιματιστικά είναι εντελώς διαφορετικές και γίνονται ανεξάρτητα η μία από την άλλη. Η εγγύηση είναι μόνο ότι οι μέθοδοι έχουν υλοποιηθεί και παρέχουν ασφαλή και ομοιόμορφο τρόπο αλληλεπίδρασης με τα χρονόμετρα των συσκευών. ​ Οι υλοποιήσεις για τις κουζίνες και τα κλιματιστικά είναι εντελώς διαφορετικές και γίνονται ανεξάρτητα η μία από την άλλη. Η εγγύηση είναι μόνο ότι οι μέθοδοι έχουν υλοποιηθεί και παρέχουν ασφαλή και ομοιόμορφο τρόπο αλληλεπίδρασης με τα χρονόμετρα των συσκευών. ​
Line 55: Line 55:
 Μια πολύ συνηθισμένη χρήση interfaces είναι για το χαρακτηρισμό αντικειμένων τα οποία μπορούν να συγκριθούν μεταξύ τους: ​ Μια πολύ συνηθισμένη χρήση interfaces είναι για το χαρακτηρισμό αντικειμένων τα οποία μπορούν να συγκριθούν μεταξύ τους: ​
  
-Η μέθοδος ​[[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​util/​Arrays.html#​sort(java.lang.Object[])|java.util.Arrays.sort]] ​μπορεί να ταξινομήσει τα περιεχόμενα ενός πίνακα που αποτελείται από οποιοδήποτε είδος αντικειμένων αλλά μόνο υπό την προϋπόθεση ότι η κλάση που αναπαριστά αυτά τα αντικείμενα υλοποιεί το interface ​[[http://​docs.oracle.com/​javase/​7/​docs/​api/​java/​lang/​Comparable.html|java.lang.Comparable]]:+Η μέθοδος ​''​Arrays.Sort'' ​μπορεί να ταξινομήσει τα περιεχόμενα ενός πίνακα που αποτελείται από οποιοδήποτε είδος αντικειμένων αλλά μόνο υπό την προϋπόθεση ότι η κλάση που αναπαριστά αυτά τα αντικείμενα υλοποιεί το interface Comparable:
 <code java> <code java>
-public interface Comparable { +public interface Comparable 
-  /** +
-   * Compares this object with the specified object for order.  +     ​int compareTo(Object other);
-   * Returns a negative integer, zero, or a positive integer  +
-   * as this object is less than, equal to, or greater than  +
-   * the specified object. +
-   */ +
-  ​int compareTo(Object other);+
 } }
 </​code>​ </​code>​
  
-Μια κλάση που υλοποιεί το Comparable πρέπει να υλοποιήσει τη μέθοδο ​**//compareTo//**. Εφόσον συμβεί αυτό, η μέθοδος ​//​**java.util.Arrays.sort**// ​μπορεί πια να αλληλεπιδράσει με τα αντικείμενα που θέλουμε να ταξινομήσουμε ώστε να μας παρέχει την υπηρεσία ταξινόμησης. ​+Μια κλάση που υλοποιεί το Comparable πρέπει να υλοποιήσει τη μέθοδο ​''​compareTo''​. Εφόσον συμβεί αυτό, η μέθοδος Arrays.Sort μπορεί πια να αλληλεπιδράσει με τα αντικείμενα που θέλουμε να ταξινομήσουμε ώστε να μας παρέχει την υπηρεσία ταξινόμησης. ​
  
-Ας δούμε ένα ​άλλο ​παράδειγμα πάνω στην κλάση Rectangle που έχουμε ορίσει σε προηγούμενες ενότητες. Σύμφωνα με το documentation του interface Comparable η μέθοδος ​compareTo πρέπει να επιστρέφει ακέραιο αρνητικό,​ μηδέν ή θετικό αν το τρέχον αντικείμενο (this) θεωρείται αντίστοιχα "​μικρότερο",​ "​ίσο" ​ ή "​μεγαλύτερο"​ από αυτό με το οποίο το συγκρίνουμε. Το πώς ορίζεται το "​μικρότερο",​ κτλ. για αντικείμενα Rectangle είναι απόφαση του προγραμματιστή που υλοποιεί την κλάση Rectangle. Στο συγκεκριμένο παράδειγμα αποφασίζουμε να συγκρίνουμε τα αντικείμενα με βάση το εμβαδό τους.+Ας δούμε ένα παράδειγμα πάνω στην κλάση Rectangle που έχουμε ορίσει σε προηγούμενες ενότητες. Σύμφωνα με το documentation του interface Comparable η compareTo πρέπει να επιστρέφει ακέραιο αρνητικό,​ μηδέν ή θετικό αν το τρέχον αντικείμενο (this) θεωρείται αντίστοιχα "​μικρότερο",​ "​ίσο" ​ ή "​μεγαλύτερο"​ από αυτό με το οποίο το συγκρίνουμε. Το πώς ορίζεται το "​μικρότερο",​ κτλ. για αντικείμενα Rectangle είναι απόφαση του προγραμματιστή που υλοποιεί την κλάση Rectangle. Στο συγκεκριμένο παράδειγμα αποφασίζουμε να συγκρίνουμε τα αντικείμενα με βάση το εμβαδό τους.
  
 <code java Rectangle.java>​ <code java Rectangle.java>​
Line 112: Line 107:
     }     }
     ​     ​
-    @Override ​ +    @Override String toString() {
-    public ​String toString() {+
         return origin + ", [" + width + " X " + height + "​]";​         return origin + ", [" + width + " X " + height + "​]";​
     }     }
Line 144: Line 138:
 ===== Χρησιμοποιώντας ένα interface ως τύπο δεδομένων ===== ===== Χρησιμοποιώντας ένα interface ως τύπο δεδομένων =====
  
-Μπορείτε να χρησιμοποιήσετε ένα Java Interface ως ένα reference τύπο δεδομένων. Μπορείτε να χρησιμοποιήσετε το όνομα ενός interface ως τον τύπο μιας παραμέτρου σε μία Java μέθοδο ή τύπο μιας τοπικής μεταβλητής στο σώμα μίας μεθόδου. Προϋπόθεση είναι οι τιμές των μεταβλητών να δείχνουν σε αντικείμενα των οποίων οι κλάσεις υλοποιούν το συγκεκριμένο interface. Δείτε το παρακάτω παράδειγμα, όπου χρησιμοποιείται η κλάση Rectangle που υλοποιήσαμε προηγούμενα.+Μπορείτε να χρησιμοποιήσετε ένα Java Interface ως ένα reference τύπο δεδομένων. Μπορείτε να χρησιμοποιήσετε το όνομα ενός interface ως τον τύπο μιας παραμέτρου σε μία Java μέθοδο ή τύπο μιας τοπικής μεταβλητής στο σώμα μίας μεθόδου. Προϋπόθεση είναι οι τιμές των μεταβλητών να δείχνουν σε αντικείμενα των οποίων οι κλάσεις υλοποιούν το συγκεκριμένο interface. Δείτε το παρακάτω παράδειγμα.
  
-Υλοποιούμε επίσης την κλάση ''​TwosComparator''​ η οποία παρέχει μεθόδους που ​μπορούν να χρησιμοποιηθούν για ​σύγκριση ανάμεσα σε οποιαδήποτε δύο αντικείμενα //εφόσον// αυτά υλοποιούν το Comparable. ​+Αρχικά ορίζουμε ένα interface με όνομα MyComparable το οποίο ορίζει τη μέθοδο isLarger ​που ​επιστρέφει true ή false ανάλογα ​με το αν το τρέχον αντικείμενο ​είναι μεγαλύτερο ή μικρότερο της παραμέτρου : 
  
-<code java MyComparator.java> +<code java MyComparable.java>  
-import ​java.lang.Comparable;+public interface MyComparable { 
 +  public boolean isLarger(MyComparable other); 
 +
 +</​code>​ 
 + 
 +Γράφουμε την Rectangle ώστε να υλοποιεί και το νέο μας interface:​ 
 +<​code ​java Rectangle.java> 
 +public class Rectangle implements ​Comparable, MyComparable{ 
 +     
 +  // the Rectangle class has 3 fields 
 +  private int width; 
 +  private int height; 
 +  private Point origin; 
 +     
 +  // the Rectangle class has one constructor 
 +  public Rectangle(int initWidth, int initHeight, Point initOrigin) { 
 +    width = initWidth;​ 
 +    height = initHeight;​ 
 +    origin = initOrigin;​ 
 +  } 
 +   
 +  public Rectangle(int initWidth, int initHeight, int xPos, int yPos) { 
 +    this(initWidth,​ initHeight, new Point(xPos,​yPos));​ 
 +  } 
 +   
 +  public Rectangle(int initWidth, int initHeight) { 
 +    this(initWidth,​ initHeight, 0, 0); 
 +  } 
 + 
 +  public void setWidth(int newWidth ) { 
 +    width = newWidth; 
 +  } 
 +   
 +  public int getWidth() { return width; } 
 +     
 +  public void setHeight(int newHeight ) { 
 +    height = newHeight;​ 
 +  } 
 +   
 +  public int getHeight() { return height; } 
 +     
 +  public void setOrigin(Point newOrigin) { 
 +    origin = newOrigin;​ 
 +  } 
 +   
 +  public Point getOrigin() { return origin; } 
 +   
 +  @Override 
 +  public int compareTo(Object other) { 
 +    Rectangle otherRect = (Rectangle) other; 
 +    return (this.getArea() - otherRect.getArea());​ 
 +  } 
 +  
 +  @Override 
 +  public boolean isLarger(MyComparable other) { 
 +   Rectangle otherRect = (Rectangle) other; 
 +    return (this.getArea() > otherRect.getArea());​ 
 +  } 
 +  
 +  @Override 
 +  public String toString() { 
 +    return origin + ", Dimensions [" + width + " X " + height + "​]";​ 
 +  } 
 +  
 +  public int getArea() { 
 +       ​return width * height; 
 +  } 
 +}  
 +</​code>​ 
 + 
 +Τώρα, μπορούμε να ορίσουμε την κλάση ''​TwosComparator''​ η οποία παρέχει μεθόδους που μπορούν να χρησιμοποιηθούν για σύγκριση ανάμεσα σε οποιαδήποτε δύο αντικείμενα //​εφόσον//​ αυτά υλοποιούν το MyComparable. ​
  
-public class MyComparator ​{+<code java TwosComparator.java>​ 
 +public class TwosComparator ​{
     ​     ​
-    ​/* Παράδειγμα χρήσης interface ως τύπο τοπικής μεταβλητής στο σώμα μιας μεθόδου. */ +    public ​MyComparable findLargest(MyComparable ​object1, ​MyComparable ​object2) { 
-    ​public ​static Comparable findLarger(Comparable ​object1, ​Comparable ​object2) { +        if (object1.isLarger(object2))
-        if (object1.compareTo(object2) ​> 0)+
             return object1;             return object1;
         else          else 
             return object2;             return object2;
     }     }
-      +    ​ 
-    /* Παράδειγμα χρήσης interface ως τύπο τοπικής μεταβλητής στο σώμα μιας μεθόδου. ​ */ +    public ​MyComparable findSmallest(MyComparable ​object1, ​MyComparable ​object2) { 
-    public ​static Comparable findSmaller(Comparable ​object1, ​Comparable ​object2) { +        if (!(object1.isLarger(object2)))
-        if (object1.compareTo(object2) ​< 0)+
             return object1;             return object1;
         else          else 
             return object2;             return object2;
-    } 
-    ​ 
-    public static Comparable findMininum(Comparable []objects) { 
-      Comparable min = objects[0]; 
-      for(Comparable object : objects) { 
-        if( object.compareTo(min) < 0 ) 
-          min = object; 
-      } 
-      return min; 
-    } 
-    ​ 
-    public static Comparable findMaximum(Comparable []objects) { 
-      Comparable max = objects[0]; 
-      for(Comparable object : objects) { 
-        if( object.compareTo(max) > 0 ) 
-          max = object; 
-      } 
-      return max; 
     }     }
 } }
 </​code>​ </​code>​
  
-Χρησιμοποιούμε την ​κλάση //​MyComparator// ​ως εξής:  +Χρησιμοποιούμε την ​TwosComparator ​ως εξής:  
-<code java CompareRectangles.java> +<code java Main.java> 
-public class CompareRectangles ​+public class Main 
- +       
-  public static void main(String args[]) { +    public static void main(String args[]) { 
-    Rectangle rec1 = new Rectangle(30,​ 40); +        Rectangle rec1 = new Rectangle(30,​ 40); 
-    Rectangle rec2 = new Rectangle(10,​ 50); +        Rectangle rec2 = new Rectangle(10,​ 50); 
-    ​Rectangle rec3 = new Rectangle(15,​ 20); +        ​TwosComparator comp = new TwosComparator();
-    Rectangle rec4 = new Rectangle(20,​ 20); +
-    +
-    System.out.println("​rec1 is " + rec1); +
-    System.out.println("​rec2 is " + rec2); +
-    System.out.println("​rec3 is " + rec3); +
-    System.out.println("​rec4 is " + rec4); +
-    +
-    System.out.println( MyComparator.findLarger(rec1,​ rec2) + " ​ is larger!"​);​ +
-    System.out.println( MyComparator.findSmaller(rec3,​ rec4) + " ​ is smaller!"​);​ +
-     +
-    Rectangle [] recs = new Rectangle[4];​ +
-    recs[0] = rec1; +
-    recs[1] = rec2; +
-    recs[2] = rec3; +
-    recs[3] = rec4; +
-     +
-    System.out.println("​Minimum Rectangle is "+ MyComparator.findMininum(recs) ); +
-    System.out.println("​Maximum Rectangle is "+ MyComparator.findMaximum(recs) ); +
-     +
-  } +
-+
-</​code>​ +
- +
-Αντίστοιχα μπορούμε αν χρησιμοποιήσουμε την κλάση //​MyComparator//​ για να συγκρίνουμε μεταξύ τους Strings, καθώς η κλάση //​java.lang.String//​ υλοποιεί το interface //​java.lang.Comparable//​. Δείτε το παρακάτω παράδειγμα. +
- +
-<code java CompareStrings.java>​ +
-public class CompareStrings { +
-  public static void main(String [] args) { +
-    String str1 = "​Hello";​ +
-    String str2 = "​Hello!";​ +
-    String str3 = "​World";​ +
-    String str4 = "my friend";​ +
-     +
-     ​System.out.println("​str1 is " + str1); +
-     ​System.out.println("​str2 is " + str2); +
-     ​System.out.println("​str3 is " + str3); +
-     ​System.out.println("str4 is " + str4);+
            
-     System.out.println( "\""​+MyComparator.findLarger(str1,​ str2) + "​\"  ​is lexicographically larger than \""+MyComparator.findSmaller(str1,​ str2)+"​\""​); +        ​System.out.println("​rec1 is " + rec1); 
-     ​System.out.println( "\""​ + MyComparator.findSmaller(str3,​ str4) + "​\"  ​is lexicographically smaller than \""+MyComparator.findLarger(str3,​ str4)+"​\""​);+        System.out.println("​rec2 is " + rec2);
            
-     ​String [] strs = new String[4];​ +        ​System.out.println( ​comp.findLargest(rec1, rec2) + " ​ is larger!"); 
-     ​strs[0] = str1; +        System.out.println( ​comp.findSmallest(rec1, rec2) + " ​ is smaller!"); 
-     ​strs[1] = str2; +    }
-     ​strs[2] = str3; +
-     ​strs[3] = str4; +
-      +
-     System.out.println("​Minimum String is \""​+ MyComparator.findMininum(strs)+"\"" ); +
-     ​System.out.println("​Maximum String is \""​+ MyComparator.findMaximum(strs)+"\"" ); +
-  }+
 } }
 </​code>​ </​code>​
- 
  
 ===== Μεταβάλλοντας ένα υφιστάμενο Interface ===== ===== Μεταβάλλοντας ένα υφιστάμενο Interface =====
Line 258: Line 259:
 **1η εναλλακτική:​** Να υλοποιήσουμε ένα νέο interface με παραπλήσιο όνομα, το οποίο να αποτελέσει τη νέα έκδοση του υφιστάμενου interface. **1η εναλλακτική:​** Να υλοποιήσουμε ένα νέο interface με παραπλήσιο όνομα, το οποίο να αποτελέσει τη νέα έκδοση του υφιστάμενου interface.
 <code java> <code java>
 +public interface DoIt {
 + 
 +   void doSomething(int i, double x);
 +   int doSomethingElse(String s);
 +}
 +
 public interface DoItPlus extends DoIt { public interface DoItPlus extends DoIt {
  
Line 380: Line 387:
 </​code>​ </​code>​
  
-| Προηγούμενο : [[ :java:array_list ​Η κλάση ArrayList ​]] | [[ :toc | Περιεχόμενα ]] | Επόμενο:​ [[ :​java:​access_modifiers | Περιοριστές πρόσβασης ]]  |+<WRAP 80% important center round> 
 +**__Παρατήρηση:​__** Οι **static** μέθοδοι στην Java υλοποιούνται στην έκδοση 8 της γλώσσας. Μεταγλωττιστές που ανήκουν σε προηγούμενες εκδόσεις αδυνατούν να μεταγλωττίσουν τον παραπάνω κώδικά. 
 +</​WRAP>​ 
 + 
 + 
 +| Προηγούμενο : [[ :java:ant Αυτόματη μεταγλώττιση με χρήση Apache Ant ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο:​ [[ :​java:​access_modifiers | Περιοριστές πρόσβασης ]]  |
  
  
  
java/interfaces.txt · Last modified: 2017/02/16 14:26 by gthanos