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
java:interfaces [2017/02/16 14:21]
gthanos
java:interfaces [2017/02/16 14:26] (current)
gthanos [Εισαγωγικά]
Line 1: Line 1:
 ====== Διεπαφή (Interface) ====== ====== Διεπαφή (Interface) ======
  
-===== Εισαγωγικά ===== 
  
-Κατά την ανάπτυξη προγραμμάτων είναι σημαντικό να είναι τυποποιημένος ο τρόπος αλληλεπίδρασης ανάμεσα σε διαφορετικά συστήματα. Η ύπαρξη ενός "​συμβολαίου"​ το οποίο καθορίζει ακριβώς το πώς μπορεί μία κλάση να αλληλεπιδράσει με μια άλλη διευκολύνει την ανεξάρτητη ανάπτυξη κώδικα από διαφορετικούς προγραμματιστές. 
- 
-Υπακούοντας στην παραπάνω αρχή, η Java εισάγει την έννοια της διεπαφής (**interface**). Τα //​interfaces//​ στη Java λειτουργούν ως προ-συμφωνημένες διεπαφές μεταξύ προγραμματιστών. Κάθε interface τυπικά σχετίζεται με: 
-  - **τους προγραμματιστές που το χρησιμοποιούν:​** οι προγραμματιστές γράφουν την εφαρμογή τους ώστε να χρησιμοποιεί τις μεθόδους του //​interface//,​ οι οποίες παρέχουν τη λειτουργικότητα που υποδεικνύει το //​interface//​ αυτό. 
-  - **τους προγραμματιστές που το υλοποιούν:​** εφόσον θέλουν να ενσωματώσουν τη λειτουργικότητα που υποδεικνύει το //​interface//​ σε συγκεκριμένες κλάσεις θα πρέπει να υλοποιήσουν τις μεθόδους του στις ​ κλάσεις αυτές. 
- 
-Από τα παραπάνω εξάγεται ότι το //​interface//​ είναι μία προσυμφωνημένη διεπαφή η οποία δεσμεύει και τις δύο πλευρές,​ τόσο τους προγραμματιστές που το υλοποιούν,​ όσο και εκείνους που το χρησιμοποιούν. Παρακάτω θα δούμε την υποστήριξη των interfaces από τον compiler της Java και τους κανόνες που τα διέπουν. 
- 
-Ως παράδειγμα,​ θεωρήστε ένα //​interface//​ το οποίο ορίζει τη χρήση ενός χρονόμετρου (//​Timer//​). Όσοι επιθυμούν να υλοποιήσουν το χρονόμετρο θα πρέπει κατ'​ ελάχιστο να υλοποιήσουν τις παρακάτω μεθόδους:​ 
-  * **setTimer:​** αρχικοποίηση του timer  
-  * **startTimer:​** έναρξη του timer και ​ 
-  * **endTimer:​** τερματισμός του timer 
- 
-Ας υποθέσουμε τώρα ότι ένας κατασκευαστής ηλεκτρικών συσκευών (κλιμαστιστικά,​ ψυγεία κ.α.) χρησιμοποιεί Java για τον αυτοματισμό τους και θέλει να χρησιμοποιεί μία κλάση τύπου //Timer// για τις συσκευές που κατασκευάζει προκειμένου να ενσωματώσει τη λειτουργία του χρονόμετρου. Για να το κάνει αυτό, μπορεί να χρησιμοποιήσει __οποιαδήποτε κλάση είναι σύμφωνη με τον παραπάνω //​interface//​__. Ας υποθέσουμε επίσης ότι υπάρχουν τουλάχιστον δύο διαφορετικές κλάσεις που υλοποιούν το συγκεκριμένο interface //​Timer//​. ​ 
- 
-Γνωρίζοντας ότι όλες οι εναλλακτικές κλάσεις που θα χρησιμοποιήσει θα υλοποιούν υποχρεωτικά το συγκεκριμένο //​interface//,​ αρκεί να σχεδιάσει και να υλοποιήσει το λογισμικό του του ώστε να χρησιμοποιεί το //​interface//​ αυτό. Σε αυτή την περίπτωση,​ σχεδιάζει και γράφει το λογισμικό με γνώμονα τον interface και όχι τη συγκεκριμένη κλάση που θα επιλέξει να χρησιμοποιήσει τελικά. 
- 
-Υιοθετώντας την έννοια του //​interface//​ και γράφοντας κώδικα που χρησιμοποιεί //​interfaces//,​ γράφουμε κώδικα που είναι ανεξάρτητος από την οποιαδήποτε υλοποίηση των //​interfaces//​ που χρησιμοποιεί. Γενικότερα,​ ισχύει η αρχή ότι οι υλοποιήσεις ενός interface μπορεί να αλλάξουν,​ τα interfaces όμως συνιστάται να παραμένουν σταθερά. 
- 
-Οποιοσδήποτε προγραμματιστής χρησιμοποιεί το παραπάνω //​interface//​ δεν χρειάζεται να γνωρίζει το παραμικρό για την εσωτερική υλοποίηση των κλάσεων που το υλοποιούν. Η επιλογή της κλάσης που το υλοποιεί μπορεί να μεταβάλλεται χωρίς να επηρεάζεται ο κώδικας που το χρησιμοποιεί. 
- 
-Αντιπαραθέστε τώρα την εναλλακτική μη ύπαρξης προσυμφωνημένων διεπαφών. Σε αυτή την περίπτωση κάθε πρόγραμμα ή ο κάθε κατασκευαστής θα έπρεπε να υλοποιεί την δική του κλάση για το χρονόμετρο,​ χωρίς να υπάρχει η δυνατότητα εύκολης χρήσης λογισμικού που προέρχεται από τρίτους. ​ 
- 
-Η προτυποποίηση που παρέχει ο μηχανισμός του //​interface//​ είναι αυτή που επιτρέπει:​ 
-  - την εύκολη και χωρίς σφάλματα επαναχρησιμοποίηση κώδικα σε διαφορετικά προγράμματα και ​ 
-  - την αλλαγή της υφιστάμενης υλοποίησης μιας κλάσης που υλοποιεί ένα //​interface//,​ δίχως οι χρήστες του //​interface//​ να έχουν γνώση για τις αλλαγές αυτές. 
- 
-| Προηγούμενο : [[ :​java:​abstract_classes | Abstract Κλάσεις ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο:​ [[ :​java:​interface_definition | Δήλωση του interface ]]  | 
java/interfaces.txt · Last modified: 2017/02/16 14:26 by gthanos