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 13:50] gthanos [Περιεχόμενα της Κλάσης] |
oop:introduction [2015/01/20 14:48] gthanos [Διεπαφές - Interfaces] |
||
---|---|---|---|
Line 56: | Line 56: | ||
| Στο διπλανή εικόνα παρουσιάζεται το παράδειγμα κληρονομικότητας της κλάσης του ποδηλάτου. Από την γενική κλάση του ποδηλάτου προκύπτουν δύο επιμέρους κλάσεις **α)** το ποδήλατο για δύο επιβάτες **β)** το ποδήλατο με ταχύτητες. | {{:oop:bicycle-hierarchy.png?200 |}} | | | Στο διπλανή εικόνα παρουσιάζεται το παράδειγμα κληρονομικότητας της κλάσης του ποδηλάτου. Από την γενική κλάση του ποδηλάτου προκύπτουν δύο επιμέρους κλάσεις **α)** το ποδήλατο για δύο επιβάτες **β)** το ποδήλατο με ταχύτητες. | {{:oop:bicycle-hierarchy.png?200 |}} | | ||
+ | |||
+ | ==== Διεπαφές - Interfaces ==== | ||
+ | |||
+ | Τα αντικείμενα στον πραγματικό κόσμο ορίζουν την διεπαφή τους με τον έξω κόσμο μέσα από συγκεκριμένα εργαλεία που καταλήγουν σε συγκεκριμένες πράξεις. Για παράδειγμα, | ||
+ | * τα κουμπιά του υπολογιστή ή του κινητού τηλεφώνου ή της τηλεόρασης ορίζουν τις δυνατότητες αλληλεπίδρασης με την συσκευή. | ||
+ | * το τιμόνι του ποδηλάτου ορίζει την πορεία του και η ταχύτητα κίνησης των πεταλιών ορίζει την ταχύτητα κίνησης του ποδηλάτου στον δρόμο. | ||
+ | |||
+ | Ανάλογη είναι η λειτουργία της **διεπαφής** για τον αντικειμενοστραφή προγραμματισμό. Ορίζουμε μία **διεπαφή**, ως ένα σύνολο από μεθόδους, δίνοντας μόνο τους ορισμούς των μεθόδων, χωρίς την υλοποίηση τους. Εάν μία κλάση υλοποιεί ΟΛΕΣ τις μεθόδους μιας διεπαφής, τότε η κλάση είναι σύμφωνη με την συγκεκριμένη διαπεφή. Ο τρόπος που υλοποιεί κάθε κλάση τις μεθόδους της διεπαφής, είναι εσωτερικό θέμα της κλάσης και δεν ελέγχεται από την διεπαφή. Επιπλέον, μία κλάση μπορεί να υλοποιεί μία ή περισσότερες διεπαφές. | ||
+ | |||
+ | <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**). Αλλαγές σε μία κλάση δεν συνεπάγονται αλλαγές και σε άλλα σημεία του προγράμματος που χρησιμοποιούν την κλάση αυτή. | ||
+ | |||
+ | |||