This shows you the differences between two versions of the page.
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(width, height, new Point(xPos,yPos)); | + | this(initWidth, initHeight, new Point(xPos,yPos)); |
} | } | ||
- | + | | |
- | public Rectangle(int width, int height) { | + | public Rectangle(int initWidth, int initHeight) { |
- | this(width, height, 0, 0); | + | this(initWidth, initHeight, 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 | Περιοριστές πρόσβασης ]] | | ||