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 | ||
oop:introduction [2015/01/20 14:19] gthanos [Διεπαφές - Interfaces] |
oop:introduction [2015/01/20 14:48] gthanos [Διεπαφές - Interfaces] |
||
---|---|---|---|
Line 63: | Line 63: | ||
* το τιμόνι του ποδηλάτου ορίζει την πορεία του και η ταχύτητα κίνησης των πεταλιών ορίζει την ταχύτητα κίνησης του ποδηλάτου στον δρόμο. | * το τιμόνι του ποδηλάτου ορίζει την πορεία του και η ταχύτητα κίνησης των πεταλιών ορίζει την ταχύτητα κίνησης του ποδηλάτου στον δρόμο. | ||
- | Ανάλογη είναι η λειτουργία της Διεπαφής για τον αντικειμενοστραφή προγραμματισμό. Ορίζουμε μία **διεπαφή**, ως ένα σύνολο από μεθόδους, δίνοντας μόνο τους ορισμούς των μεθόδων, χωρίς την υλοποίηση τους. Εάν μία κλάση υλοποιεί ΟΛΕΣ τις μεθόδους μιας διεπαφής, τότε η κλάση είναι σύμφωνη με την συγκεκριμένη διαπεφή. Ο τρόπος που υλοποιεί κάθε κλάση τις μεθόδους της διεπαφής, είναι εσωτερικό θέμα της κλάσης και δεν ελέγχεται από την διεπαφή. Επιπλέον, μία κλάση μπορεί να υλοποιεί μία ή περισσότερες διεπαφές. | + | Ανάλογη είναι η λειτουργία της **διεπαφής** για τον αντικειμενοστραφή προγραμματισμό. Ορίζουμε μία **διεπαφή**, ως ένα σύνολο από μεθόδους, δίνοντας μόνο τους ορισμούς των μεθόδων, χωρίς την υλοποίηση τους. Εάν μία κλάση υλοποιεί ΟΛΕΣ τις μεθόδους μιας διεπαφής, τότε η κλάση είναι σύμφωνη με την συγκεκριμένη διαπεφή. Ο τρόπος που υλοποιεί κάθε κλάση τις μεθόδους της διεπαφής, είναι εσωτερικό θέμα της κλάσης και δεν ελέγχεται από την διεπαφή. Επιπλέον, μία κλάση μπορεί να υλοποιεί μία ή περισσότερες διεπαφές. |
- | <wrap Στη Java o μεταγλωτιστής απαιτεί τη υλοποίηση όλων των μεθόδων που ορίζει η διεπαφή από την κλάση που τη υλοποιεί. /> | + | <WRAP tip> Στη γλώσσα Java o μεταγλωτιστής απαιτεί τη υλοποίηση όλων των μεθόδων που ορίζει η διεπαφή από την κλάση που την υλοποιεί. </WRAP> |
+ | Για παράδειγμα στη γλώσσα Java μπορεί να οριστεί η παρακάτω διεπαφή | ||
+ | <code java> | ||
+ | interface Bicycle { | ||
+ | void changeCadence(int newValue); | ||
+ | void changeGear(int newValue); | ||
+ | void speedUp(int increment); | ||
+ | void applyBrakes(int decrement); | ||
+ | } | ||
+ | </code> | ||
+ | Η παρακάτω κλάση υλοποιεί το interface Bicycle ως εξής: | ||
+ | <code java> | ||
+ | class ACMEBicycle implements Bicycle { | ||
+ | int cadence = 0; int speed = 0; int gear = 1; | ||
+ | |||
+ | void changeCadence(int newValue) { | ||
+ | cadence = newValue; | ||
+ | } | ||
+ | void changeGear(int newValue) { | ||
+ | gear = newValue; | ||
+ | } | ||
+ | void speedUp(int increment) { | ||
+ | speed = speed + increment; | ||
+ | } | ||
+ | void applyBrakes(int decrement) { | ||
+ | speed = speed - decrement; | ||
+ | } | ||
+ | void printStates() { | ||
+ | System.out.println("cadence:" + | ||
+ | cadence + " speed:" + | ||
+ | speed + " gear:" + gear); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | ==== Πλεονεκτήματα του Αντικ/στραφούς Προγραμματισμού ==== | ||
+ | * **Modularity:** O κώδικας μίας κλάσης μπορεί να σχεδιαστεί και να αναπτυχθεί εντελώς ανεξάρτητα από τον κώδικα άλλης κλάσης. Η υλοποίηση μίας κλάσης μπορεί να αλλάξει ριζικά χωρίς να επηρεαστεί ο κώδικας των κλάσεων που χρησιμοποιούν τη συγκεκριμένη κλάση. | ||
+ | * **Απόκρυψη πληροφορίας:** Στον αντικειμενοστραφή προγραμματισμό δεν μας ενδιαφέρει η εσωτερική υλοποίηση κάθε κλάσης αλλά μόνο οι δημόσιες (public) μέθοδοι που υλοποιεί. | ||
+ | * **Επαναχρησιμοποίση κώδικα:** Η κλάση σχεδιάζεται έτσι ώστε να μπορεί να επαναχρησιμοποιηθεί και σε άλλα προγράμματα. | ||
+ | * **Επεκτασιμότητα:** Η κλάση μπορεί να επεκταθεί μέσω της κληρονομικότητας σε πιο ειδικές κλάσεις. | ||
+ | * **Ευκολότερη αποσφαλμάτωση:** Κατά την αποσφαλμάτωση ο αρχικός έλεγχος μπορεί να γίνει σε επίπεδο κλάσης (**Unit testing**). Αλλαγές σε μία κλάση δεν συνεπάγονται αλλαγές και σε άλλα σημεία του προγράμματος που χρησιμοποιούν την κλάση αυτή. | ||