Κεντρικό στοιχείο του Αντικειμενοστραφούς Προγραμματισμού είναι η χρήση αντικειμένων. Τα αντικείμενα στον αντικειμενοστραφή προγραμματισμό τείνουν να προσομοιάσουν ευρύτερες έννοιες που υφίστανται στον πραγματικό κόσμο. Παραδείγματα αντικειμένων μπορεί να είναι τα ακόλουθα:
Τα “αντικείμενα” στον πραγματικό κόσμο έχουν δύο βασικά χαρακτηριστικά:
Σε αναλογία των παραπάνω, τα αντικείμενα στον αντικειμενοστραφή προγραμματισμό διαθέτουν:
Τα αντικείμενα που περιγράψαμε παραπάνω αποτελούν (εναλλακτικές) υλοποιήσεις ενός βασικού σχεδίου. Για παράδειγμα, όταν παράγεται ένα αυτοκίνητο, αυτό αποτελεί υλοποίηση του βασικού σχεδίου του αυτοκινήτου, έτσι όπως αυτό υλοποιείται από το εργοστάσιο κατασκευής. Μέρος του σχεδίου είναι η ύπαρξη κάποιων παραμέτρων όπως το χρώμα ή το επίπεδο του εξοπλισμού.
Στον πραγματικό κόσμο μπορούμε να έχουμε διαφορετικές υλοποιήσεις ενός σχεδίου, διαφοροποιώντας κάποιες αρχικές παραμέτρους στο σχέδιο αυτό. Για παράδειγμα, μπορούμε να έχουμε διαφορετικές εκδόσεις για τα αυτοκίνητα ενός μοντέλου (π.χ. διαφοροποίηση στο επίπεδο του εξοπλισμού ή στο χρώμα).
Ανάλογα, στον αντικειμενοστραφή προγραμματισμό, μία κλάση μπορεί να δώσει διαφοροποιημένα αντικείμενα. Κάθε αντικείμενο υλοποιείται από μία μέθοδο που καλείται κατασκευαστής (constructor). Ο κατασκευαστής της κλάσης υλοποιεί το κάθε αντικείμενο με βάση το σχέδιο της κλάσης και μπορεί να κληθεί για διαφορετικά αντικείμενα με διαφορετικές παραμέτρους, οδηγώντας τελικά σε διαφοροποιημένα αντικείμενα ως προς τα χαρακτηριστικά τους.
Μία κλάση μπορεί να έχει περισσότερους του ενός κατασκευαστές. Οι κατασκευαστές είναι μέθοδοι (συναρτήσεις) που κάνουν τα εξής:
Κάθε κλάση περιέχει κατά βάση τρία (3) πράγματα:
Στον πραγματικό κόσμο πολλά πράγματα μοιράζονται κοινά χαρακτηριστικά. Για παράδειγμα:
Με βάση την παραπάνω παρατήρηση, μπορούμε να ορίσουμε κλάσεις που περιγράφουν γενικές έννοιες και στην συνέχεια να τις εξειδικεύσουμε δημιουργώντας νέες κλάσεις που περιγράφουν πιο ειδικές έννοιες. Ο λόγος που θα θέλαμε να κάνουμε κάτι τέτοιο είναι ότι κατά την εξέλιξη του λογισμικού θέλουμε κατά το δυνατόν να επαναχρησιμοποιήσουμε κώδικα που ήδη έχουμε.
Όταν εφευρέθηκε το ποδήλατο με ταχύτητες, ο εφευρέτης χρησιμοποίησε το υφιστάμενο βασικό σχέδιο του ποδηλάτου για να προσθέσει τον μηχανισμό των ταχυτήτων και να δημιουργήσει ένα νέο τύπο ποδηλάτου, το ποδήλατο με ταχύτητες. Σε αναλογία με τον πραγματικό κόσμο, ας υποθέσουμε ότι έχουμε μία κλάση που περιγράφει το κλασσικό ποδήλατο χωρίς ταχύτητες μέσω των παρακάτω τεσσάρων μεταβλητών.
Παράλληλα, η κλάση μας θα πρέπει να έχει και κάποιες συναρτήσεις για την μεταβολή της τιμής των παραπάνω μεταβλητών στις οποίες δεν θα επεκταθούμε σε αυτό το σημείο. Ας υποθέσουμε τώρα ότι θέλουμε να σχεδιάσουμε το ποδήλατο με ταχύτητες. Θα χρειαστεί να προσθέσουμε μία νέα μεταβλητή που αντιπροσωπεύει την θέση της αλυσίδας στο γρανάζι μέσω ενός ακεραίου (π.χ. 1-5 για ένα ποδήλατο με 5 ταχύτητες). Η ιδιότητα της κληρονομικότητας μας επιτρέπει να δημιουργήσουμε τη νέα κλάση του ποδηλάτου με ταχύτητες, επεκτείνοντας την κλάση του κλασσικού ποδηλάτου και προσθέτοντας την επιπλέον μεταβλητή για την θέση της αλυσίδας στο γρανάζι και ανάλογη λειτουργικότητα μέσω συναρτήσεων. Η κληρονομικότητα μας επιτρέπει να μην γράψουμε την νέα κλάση από την αρχή αλλά να πατήσουμε πάνω σε ένα υφιστάμενο σχέδιο.
Επεκτείνοντας την παραπάνω συλλογιστική μπορούμε να έχουμε πολλαπλές ιεραρχίες κλάσεων. Για παράδειγμα, από το ποδήλατο με ταχύτητες μπορεί να οριστεί το ποδήλατο για δύο επιβάτες με ταχύτητες ή το ποδήλατο για δύο επιβάτες με ταχύτητες και αμορτισέρ.
ποδήλατο –> ποδήλατο με ταχύτητες –> ποδήλατο με ταχύτητες για δύο επιβάτες → ποδήλατο με ταχύτητες και αμορτισέρ για δύο επιβάτες.
Για το ποδήλατο με ταχύτητες η κλάση ποδήλατο αποτελεί την γονική κλάση (Super Class). Αντίστοιχα για το ποδήλατο, το ποδήλατο με ταχύτητες αποτελεί υποκλάση (Sub Class) αυτού.
Τα αντικείμενα στον πραγματικό κόσμο ορίζουν την διεπαφή τους με τον έξω κόσμο μέσα από συγκεκριμένα εργαλεία που καταλήγουν σε συγκεκριμένες πράξεις. Για παράδειγμα,
Ανάλογη είναι η λειτουργία της διεπαφής (interface) για τον αντικειμενοστραφή προγραμματισμό. Ορίζουμε μία διεπαφή, ως ένα σύνολο από μεθόδους δίνοντας μόνο τους ορισμούς των μεθόδων, χωρίς την υλοποίηση τους. Οι μέθοδοι αυτές περιγράφουν τους τρόπους αλληλεπίδρασης των υπόλοιπων κλάσεων με τις κλάσεις που υλοποιούν τις συγκεκριμένες διεπαφές.
Σε αναλογία με τον πραγματικό κόσμο, σκεφτείτε ότι θέλετε να προτυποποιήσετε την διεπαφή της τηλεόρασης. Οποιαδήποτε τηλεόραση θα πρέπει να έχει τουλάχιστον τα εξής: είσοδο για καλώδιο τροφοδοσίας ρεύματος, power button, κουμπί channel up/down, κουμπί volume up/down και μενού για τη διαχείριση των καναλιών και οθόνη. Οποιαδήποτε τηλεόραση μπορεί να έχει περισσότερα από τα παραπάνω, αλλά δεν μπορεί να έχει λιγότερα. Η διεπαφή επομένως ορίζει τα ελάχιστα ή απαραίτητα που πρέπει να υλοποιεί μία κλάση προκειμένου να είναι συγκεκριμένου τόπου. Για παράδειγμα, μία τηλεόραση χωρίς κουμπί για να αλλάζουν τα κανάλια ή χωρίς οθόνη μάλλον δεν συγκεντρώνει όλα τα χαρακτηριστικά της τηλεόρασης.
Παρατηρήστε ότι η διεπαφή όπως την ορίσαμε παραπάνω δεν σας λέει τίποτα για το πως είναι φτιαγμένη εσωτερικά η τηλεόραση ή ποιες τεχνολογίες χρησιμοποιεί. Το μόνο που μπορεί να σας εξασφαλίσει η διεπαφή που θα προτυποιήσετε είναι να διαπιστώσετε εάν μία συσκευή που βρίσκεται μπροστά σας είναι τηλεόραση ή όχι.
Εάν μία κλάση υλοποιεί ΟΛΕΣ τις μεθόδους μιας διεπαφής, τότε η κλάση είναι σύμφωνη με την συγκεκριμένη διεπαφή. Ο τρόπος που υλοποιεί κάθε κλάση τις μεθόδους της διεπαφής είναι εσωτερικό θέμα της κλάσης και δεν ελέγχεται από την διεπαφή. Μία κλάση μπορεί να υλοποιεί περισσότερες από μία διεπαφές.
Ας υποθέσουμε ότι ορίζεται η διεπαφή MotorPropelled
η οποία περιγράφει ένα σύνολο μεθόδων που πρέπει να υλοποιούνται από μία κλάση προκειμένου τα αντικείμενα της κλάσης αυτής να είναι MotorPropelled
(δηλαδή να κινούνται και με χρήση μηχανής εσωτερικής καύσης). Ας υποθέσουμε ότι οι μέθοδοι που χρειαζόμαστε είναι οι παρακάτω:
Αν οποιαδήποτε κλάση υλοποιεί τις παραπάνω μεθόδους τότε μπορούμε να πούμε ότι υλοποιεί το συγκεκριμένο interface, δηλ. τα αντικείμενα της κλάσης αυτής είναι MotorPropelled. Η νέα κλάση μπορεί να είναι κάποια υποκλάση μιας ήδη γνωστής κλάσης (π.χ. μία υποκλάση της κλάσης Bicycle) αλλά μπορεί να είναι και οποιαδήποτε άλλη κλάση αυτοκινούμενου οχήματος ακόμη και μία κλάση που ορίζεται εξ' αρχής.
Στον αντικειμενοστραφή προγραμματισμό, όσες κλάσεις υλοποιούν όλες τις παραπάνω μεθόδους, υλοποιούν συνολικά το interface. Ως εκ τούτου υποστηρίζουν τις ιδιότητες του interface.
Προηγούμενο: Εντολές τερματισμού και ελέγχου της ανακύκλωσης | Περιεχόμενα | Επόμενο: Η κλάση |