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
Previous revision
Next revision Both sides next revision
java:interfaces [2016/03/11 21:06]
gthanos [Υλοποιώντας ένα Interface]
java:interfaces [2016/04/09 06:48]
gthanos [Χρησιμοποιώντας ένα interface ως τύπο δεδομένων]
Line 17: Line 17:
  
 Ως παράδειγμα,​ θεωρήστε ένα interface το οποίο ορίζει πως όποιοι κατασκευαστές συσκευών θέλουν να χρησιμοποιήσουν χρονόμετρο σε συσκευή τους πρέπει να υλοποιήσουν τις μεθόδους setTimer, startTimer και endTimer. ​ Ως παράδειγμα,​ θεωρήστε ένα interface το οποίο ορίζει πως όποιοι κατασκευαστές συσκευών θέλουν να χρησιμοποιήσουν χρονόμετρο σε συσκευή τους πρέπει να υλοποιήσουν τις μεθόδους setTimer, startTimer και endTimer. ​
-Ένας κατασκευαστής κλιματιστικών (που θέλει να μπορεί να σταματήσει η λειτουργία της συσκευής μετά από ένα χρονικό διάστημα),​ και ένας κατασκευαστής κουζινών (που θέλει η κουζίνα του να παράγει έναν ήχο μετά από ένα χρονικό διάστημα) επιλέγουν να υλοποιήσουν αυτές τις μεθόδους. Με αυτόν το τρόπο τηρούντηρήσουν ένα συμβόλαιο αλληλεπίδρασης με το χρονόμετρο.+Ένας κατασκευαστής κλιματιστικών (που θέλει να μπορεί να σταματήσει η λειτουργία της συσκευής μετά από ένα χρονικό διάστημα),​ και ένας κατασκευαστής κουζινών (που θέλει η κουζίνα του να παράγει έναν ήχο μετά από ένα χρονικό διάστημα) επιλέγουν να υλοποιήσουν αυτές τις μεθόδους. Με αυτόν το τρόπο τηρούν ένα συμβόλαιο αλληλεπίδρασης με το χρονόμετρο.
  
 Οι υλοποιήσεις για τις κουζίνες και τα κλιματιστικά είναι εντελώς διαφορετικές και γίνονται ανεξάρτητα η μία από την άλλη. Η εγγύηση είναι μόνο ότι οι μέθοδοι έχουν υλοποιηθεί και παρέχουν ασφαλή και ομοιόμορφο τρόπο αλληλεπίδρασης με τα χρονόμετρα των συσκευών. ​ Οι υλοποιήσεις για τις κουζίνες και τα κλιματιστικά είναι εντελώς διαφορετικές και γίνονται ανεξάρτητα η μία από την άλλη. Η εγγύηση είναι μόνο ότι οι μέθοδοι έχουν υλοποιηθεί και παρέχουν ασφαλή και ομοιόμορφο τρόπο αλληλεπίδρασης με τα χρονόμετρα των συσκευών. ​
Line 144: Line 144:
 <code java MyComparable.java> ​ <code java MyComparable.java> ​
 public interface MyComparable { public interface MyComparable {
-  public boolean isLarger(Object ​other);+  public boolean isLarger(MyComparable ​other);
 } }
 </​code>​ </​code>​
Line 150: Line 150:
 Γράφουμε την Rectangle ώστε να υλοποιεί και το νέο μας interface: Γράφουμε την Rectangle ώστε να υλοποιεί και το νέο μας interface:
 <code java Rectangle.java>​ <code java Rectangle.java>​
-public class Rectangle implements MyComparable, Comparable ​{+public class Rectangle implements MyComparable{
     ​     ​
 +  // the Rectangle class has 3 fields
   private int width;   private int width;
   private int height;   private int height;
   private Point origin;   private Point origin;
     ​     ​
-  ​private int id; +  ​// the Rectangle class has one constructor 
- +  public Rectangle(int ​initWidth, int initHeight, Point initOrigin) { 
-  public Rectangle(int ​width, int height, Point origin) { +    width = initWidth
-    ​this.width = width+    height = initHeight
-    ​this.height = height+    origin = initOrigin;
-    ​this.origin = origin;+
   }   }
   ​   ​
-  public Rectangle(int ​width, int height, int xPos, int yPos) { +  public Rectangle(int ​initWidth, int initHeight, int xPos, int yPos) { 
-    this(widthheight, new Point(xPos,​yPos));​+    this(initWidthinitHeight, new Point(xPos,​yPos));​
   }   }
- +  ​ 
-  public Rectangle(int ​width, int height) { +  public Rectangle(int ​initWidth, int initHeight) { 
-    this(widthheight, 0, 0);+    this(initWidthinitHeight, 0, 0);
   }   }
  
-  ​@Override +  public ​void setWidth(int newWidth ​) { 
-  ​public int compareTo(Object other) { +    ​width ​newWidth;
-  ​Rectangle otherRect ​(Rectangle) other; +
-    return (this.getArea() - otherRect.getArea());+
   }   }
 +   
 +  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   @Override
-  public boolean isLarger(Object ​other) { +  public boolean isLarger(MyComparable ​other) { 
- Rectangle otherRect = (Rectangle) other;+   ​Rectangle otherRect = (Rectangle) other;
     return (this.getArea() > otherRect.getArea());​     return (this.getArea() > otherRect.getArea());​
   }   }
 + 
   @Override   @Override
   public String toString() {   public String toString() {
-    return origin + ", [" + width + " X " + height + "​]";​+    return origin + ", ​Dimensions ​[" + width + " X " + height + "​]";​
   }   }
 + 
   public int getArea() {   public int getArea() {
        ​return width * height;        ​return width * height;
   }   }
-  /* οι υπόλοιπες μέθοδοι παραλλείπονται για συντομία */ +
-}+
 </​code>​ </​code>​
  
Line 201: Line 212:
 public class TwosComparator { public class TwosComparator {
     ​     ​
-    ​/* Παράδειγμα χρήσης interface ως τύπο τοπικής μεταβλητής στο σώμα μιας μεθόδου. */ +    public ​MyComparable findLarger(MyComparable ​object1, ​MyComparable ​object2) { 
-    ​public ​Object findLargest(Object ​object1, ​Object ​object2) { +        ​if (object1.isLarger(object2))
-        ​MyComparable obj1 = (MyComparable)object1+
-        MyComparable obj2 = (MyComparable)object2;​ +
-        if (obj1.isLarger(obj2))+
             return object1;             return object1;
         else          else 
             return object2;             return object2;
     }     }
-      +    ​ 
-    /* Παράδειγμα χρήσης interface ως τύπο τοπικής μεταβλητής στο σώμα μιας μεθόδου. ​ */ +    public ​MyComparable findSmaller(MyComparable ​object1, ​MyComparable ​object2) { 
-    public ​Object findSmallest(Object ​object1, ​Object ​object2) { +        if (!(object1.isLarger(object2)))
-        MyComparable obj1 = (MyComparable)object1;​ +
-        MyComparable obj2 = (MyComparable)object2;​ +
-        if (!(obj1.isLarger(obj2)))+
             return object1;             return object1;
         else          else 
Line 235: Line 240:
         System.out.println("​rec2 is " + rec2);         System.out.println("​rec2 is " + rec2);
            
-        System.out.println( comp.findLargest(rec1, rec2) + " ​ is larger!"​);​ +        System.out.println( comp.findLarger(rec1, rec2) + " ​ is larger!"​);​ 
-        System.out.println( comp.findSmallest(rec1, rec2) + " ​ is smaller!"​);​+        System.out.println( comp.findSmaller(rec1, rec2) + " ​ is smaller!"​);​
     }     }
 } }
Line 248: Line 253:
 **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 370: Line 381:
 </​code>​ </​code>​
  
-Προηγούμενο ​: [[ :java:ant | Αυτόματη μεταγλώττιση με χρήση Apache Ant ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο:​ [[ :​java:​access_modifiers | Περιοριστές πρόσβασης ]]  |+<WRAP 80% important center round> 
 +**__Παρατήρηση:​__** Οι **static** μέθοδοι στην Java υλοποιούνται στην έκδοση 8 της γλώσσας. Μεταγλωττιστές που ανήκουν σε προηγούμενες εκδόσεις αδυνατούν να μεταγλωττίσουν τον παραπάνω κώδικά. 
 +</​WRAP>​ 
 + 
 + 
 +| Προηγούμενο : [[ :​java:​abstract_classes | Abstract Κλάσεις ​]] | [[ :toc | Περιεχόμενα ]] | Επόμενο:​ [[ :​java:​access_modifiers | Περιοριστές πρόσβασης ]]  |
  
  
  
java/interfaces.txt · Last modified: 2017/02/16 14:26 by gthanos