Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Ενότητα 8: Κληρονομικότητα Το περιεχόμενο του μαθήματος διατίθεται με άδεια Creative Commons εκτός και αν αναφέρεται διαφορετικά Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Αντικειμενοστραφής Προγραμματισμός Διάλεξη 8 Οικονόμου Βαγγέλης
Περιεχόμενα Κληρονομικότητα Υπερβαση μεθόδων Εικονικές Μέθοδοι
Κληρονομικότητα Ένα μεγάλο πλεονέκτημα του ΑΠ είναι ότι μια κλάση που δημιουργείτε για ένα πρόγραμμα μπορεί να χρησιμοποιηθεί και σε άλλα προγράμματα Επίσης, η C++ μας επιτρέπει να κατασκευάζουμε μια κλάση από μια άλλη Όταν κατασκευάζουμε μια κλάση από μια άλλη, η νέα τάξη κληρονομεί τα χαρακτηριστικά της αρχικής Η κληρονομικότητα μας βοηθάει να γράφουμε λιγότερα προγράμματα
Κληρονομικότητα Στόχος Α.Π.: Επαναχρησιμοποίηση μιας κλάσης, η κληρονομικότητα μας οδηγεί προς τα εκεί Καθώς φτιάχνουμε μια νέα τάξη μπορεί να χρησιμοποιεί (κληρονομεί) αρκετά χαρακτηριστικά από μια προϋπάρχουσα κλάση και να προσθέτει κάποια καινούργια Η νέα τάξη κληρονομεί τα μέλη της υπάρχουσας κλάσης (βασική κλάση base class) και ονομάζεται παράγωγη κλάση (derived class) Κληρονομικότητα είναι η δυνατότητα μιας παράγωγης τάξης να κληρονομεί τα χαρακτηριστικά μιας υπάρχουσας τάξης
Κληρονομικότητα Για να διευκολύνουμε τη συζήτηση σχετικά με την κληρονομικότητα θα εστιάσουμε στις σχέσεις ενός αριθμού κλάσεων που αναπαριστούν ζώα (παιχνίδι εξομοίωση ενός αγροκτήματος). Όταν δηλώνουμε μια κλάση, μπορούμε να δηλώσουμε και από ποιά κατηγορία απορρέει χρησιμοποιώντας τον τελεστή: Παράδειγμα: class Dog : public Mammal Η κλάση Mammal πρέπει να δηλωθεί πριν την κλάση Dog, αλλιώς θα προκληθεί σφάλμα στον μεταγλωττιστή
Κληρονομικότητα class Mammal{ public: Mammal(); ~Mammal(); int getage() const; void setage(int a); int getweight(); void setweight(int g); void Sleep(); protected: int age; int weight; };
Κληρονομικότητα class Dog : public Mammal{ public: Dog(); ~Dog(); int getcolor() const; void setcolor(int c); protected: int color; };
Κληρονομικότητα Τα private μέλη δε είναι διαθέσιμα στις απορρέουσες κλάσεις protected: κάνει διαθέσιμα τα δεδομένα στην τρέχουσα κλάση και στις κλάσεις που απορρέουν απο αυτήν Τα προστατευμένα μέλη είναι πλήρως ορατά στις απορρέουσες κλάσεις, αλλά για όλες τις άλλες είναι αόρατα.
Κληρονομικότητα int main() { Dog fido; fido.sleep(); cout<<"age of fido:"<<fido.getage()<<endl; cout<<"color of fido:"<<fido.getcolor()<<endl; return 0; } Παράδειγμα σε Visual C++!!!!!!!!
Κληρονομικότητα Τα αντικείμενα Dog είναι και αντικείμενα Mammal Όταν δημιουργούμε ένα αντικείμενο Dog καλείται πρώτα η συνάρτηση δημιουργίας της βασικής κλάσης Mammal και έπειτα η συνάρτηση δημιουργίας της παράγωγης κλάσης Dog για να ολοκληρωθεί το αντικείμενο τύπου Dog Το αντικείμενο fido δεν υπάρχει εώς ότου ολοκληρωθεί η δόμηση του, που σημαίνει ότι πρέπει να δημιουργηθούν και τα δύο του μέρη, Mammal και Dog
Κληρονομικότητα Εάν θέλαμε η κλάση Dog κατά τη δημιουργία ενός αντικειμένου της να θέτει τη δικιά της τιμή στο μέλος δεδομένων age τι θα κάναμε; Θα υπερφορτώναμε την συνάρτηση δημιουργίας
Κληρονομικότητα class Dog : public Mammal{ public: Dog(); Dog(int a); ~Dog(); int getcolor() const; void setcolor(int c); protected: int color; }; Dog::Dog(int a) { age = a; color=1; }
Κληρονομικότητα Υπέρβαση μεθόδων Ένα αντικείμενο Dog έχει πρόσβαση σε όλες τις μεθόδους και μέληδεδομένων της Mammal, όπως η Sleep. Μπορεί επίσης να υπερβεί μια συνάρτηση της βασικής κλάσης. Υπέρβαση μιας συνάρτησης σημαίνει αλλαγή της υλοποίησης της συνάρτησης στην απορρέουσα κλάση. Προσοχη: Υπέρβαση και Υπερφόρτωση. Αυτοί οι όροι μοιάζουν και κάνουν παρόμοια πράγματα, αλλά δε είναι το ίδιο πράγμα
Κληρονομικότητα Υπέρβαση μεθόδων class Dog : public Mammal{ public: Dog(); Dog(int a); ~Dog(); int getcolor() const; void setcolor(int c); void Sleep(); protected: int color; }; void Dog::Sleep() { cout<< Dog sleeping <<endl; }
Κληρονομικότητα Υπέρβαση μεθόδων Εάν έχουμε υπερβεί τη μέθοδο βάσης είναι ακόμα δυνατόν να την καλέσουμε, προσδιορίζοντας πλήρως το όνομα της Παράδειγμα: fido.mammal::sleep();
Εικονικές Μέθοδοι Μέχρι τώρα είδαμε ότι ένα αντικείμενο Dog είναι και αντικείμενο Mammal, με την έννοια ότι κληρονομεί όλα τα χαρακτηριστικά και ιδιότητες της κατηγορίας βάσης Η C++ επιτρέπει σε δείκτες της κλάσης βάσης να εκχωρούνται σε αντικείμενα της παράγωγης κλάσης Mammal *pm = new Dog; Τι κερδίζουμε με αυτό;
Εικονικές Μέθοδοι Υποθέστε ότι έχετε διάφορα αντικείμενα από διαφορετικές κλάσεις, αλλά θέλετε να τα βάλετε όλα σε έναν πίνακα και να εκτελέσετε σε αυτά κάποια συγκεκριμένη λειτουργία χρησιμοποιώντας την ίδια κλήση συνάρτησης. Παράδειγμα: cat, dog είναι όλα mammal και θέλουμε να καλέσουμε τη συνάρτηση Speak. Στον πίνακα εισάγουμε δείκτες πρός τα αντικείμενα μας και μετά καλούμε την συνάρτηση Διαφορετικές συναρτήσεις εκτελούνται από την ίδια κλήση συνάρτησης Mammal *patr[5]; for (i=0;i<;5i++) { patr[i]->speak(); }
Εικονικές Μέθοδοι Εικονική (virtual) σημαίνει ότι κάτι φαίνεται να υπάρχει αλλά στην πραγματικότητα δεν υπάρχει class Mammal{ public: Mammal(){age=1;} ~Mammal(){cout<<"Mammal destructor"<<endl;} void Move(){cout<<"move one step."<<endl;} virtual void Speak(){cout<<"Mammal speak"<<endl;} protected: int age; };
Εικονικές Μέθοδοι class Dog : public Mammal{ public: Dog(){}; ~Dog(){cout<<"Dog destructor."<<endl;} void Speak(){cout<<"Woof!!!"<<endl;} void Move(){cout<<"Move three steps."<<endl;} };
Εικονικές Μέθοδοι int main() { Mammal *pdog = new Dog; pdog->move(); pdog->speak(); }
Άσκηση Η παρακάτω άσκηση αναφέρεται στην χρήση στατικών μεταβλητών σε μια κλάση και στην έννοια της κληρονομικότητας. Μια στατική μεταβλητή ή συναρτηση «ανήκει» στην κλάση (ή την κατηγορία) και είναι κοινή για όλα τα αντικέιμενα αυτής της κλάσης. Έστω ότι θέλετε να σχεδιάσετε ένα παιχνίδι. Σε αυτό το παιχνίδι θα υπάρχουν 2 φυλές, οι Human (Άνθρωποι) και τα Elf (Ξωτικά). Προφανώς σε αυτες τις 2 φυλές θα υπάρχουν κοινά χαρακτηριστικά και χαρακτηριστικά που θα τις κάνουν να διαφέρουν. Στο παράδειγμα μας θα χρησιμοποιήσουμε ένα κοινό χαρακτηριστικό, τη ζωή (ή hit points), ενώ οι δυο φυλές διαφέρουν στο εξής: Τα Ξωτικά έχουν μαγική δύναμη ενώ οι Ανθρωποι έχουν φυσική δύναμη.
Άσκηση (συνέχεια) Δημιουργήστε μια κλάση με το όνομα Player, που θα είναι η κλαση βάσης. Η κλάση Player θα έχει ένα προστατεύομενο μέλος, τα hit_points, καθώς και μια στατική μεταβλητή τύπου ακέραιου (static int) που θα μετράει πόσοι πάικτες δημιουργηθήκαν. Υλοποιήστε τις παρακάτω συναρτήσεις της κλάσης Player: 1. Συναρτήσεις πρόσβασης για τo ιδιωτικό μέλος της κλάσης. 2. Μια συνάρτηση δημιουργίας, χωρίς ορίσματα που θα θέτει τα hit_points ίσον με το μηδέν και θα αυξάνει τη στατική μεταβλητή. Από την κλάση Player θα προκύπτουν οι κλάσεις Human και Elf. Η κλάση Human θα έχει μια ιδιωτική μεταβλήτη που θα εκφράζει την φυσική δύναμη (physical_power), ενώ η κλάση Elf θα έχει μια ιδιωτική μεταβλήτη που θα εκφράζει την μαγική δύναμη (magical_power). Δημιουργήστε συναρτήσεις δημιουργίας για αυτες τις 2 κλάσεις με 2 ορίσματα, όπως και συναρτήσεις πρόσβασης για τα ιδιωτικά μέλη τους. Επίσης, η κάθε κλάση θα έχει μια στατική μεταβλητή που θα μετράει πόσα Elfs και πόσοι Humans δημιουργήθηκαν.
Άσκηση (συνέχεια) Στην main συνάρτηση θα δηλώσετε 2 αντικείμενα τύπου Elf με τη βοήθεια δεικτων, όπου θα δώσετε τιμές μέσω των συναρτησεων δημιουργίας και θα εμφανιζετε στην οθόνη τις τιμές των μεταβλητών μέσω των συναρτήσεων πρόσβασης. Με παρόμοιο τρόπο θα δημιουργήσετε και ένα αντικέιμενο τύπου Human και θα κάνετε τις αντίστοιχες ενέργειες. Έπειτα, θα εμφανίσετe στην οθόνη πόσοι παίκτες δημιουργήθηκαν, πόσα Elfs και πόσοι Humans, δηλ. θα εμφανίσετε τις τιμές των τριών στατικών μεταβλητών στην οθόνη. Τέλος, θα διαγράψετε τους δείκτες που δημιουργήσατε.
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά, Μη Εμπορική Χρήση Παρόμοια Διανομή 4.0 [1] ή μεταγενέστερη, Διεθνής Έκδοση. Εξαιρούνται τα αυτοτελή έργα τρίτων π.χ. φωτογραφίες, διαγράμματα κ.λ.π., τα οποία εμπεριέχονται σε αυτό. Οι όροι χρήσης των έργων τρίτων επεξηγούνται στη διαφάνεια «Επεξήγηση όρων χρήσης έργων τρίτων». Τα έργα για τα οποία έχει ζητηθεί άδεια αναφέρονται στο «Σημείωμα Χρήσης Έργων Τρίτων». [1] http://creativecommons.org/licenses/από-nc-sa/4.0/ Ως Μη Εμπορική ορίζεται η χρήση: που δεν περιλαμβάνει άμεσο ή έμμεσο οικονομικό όφελος από την χρήση του έργου, για το διανομέα του έργου και αδειοδόχο που δεν περιλαμβάνει οικονομική συναλλαγή ως προϋπόθεση για τη χρήση ή πρόσβαση στο έργο που δεν προσπορίζει στο διανομέα του έργου και αδειοδόχο έμμεσο οικονομικό όφελος (π.χ. διαφημίσεις) από την προβολή του έργου σε διαδικτυακό τόπο Ο δικαιούχος μπορεί να παρέχει στον αδειοδόχο ξεχωριστή άδεια να χρησιμοποιεί το έργο για εμπορική χρήση, εφόσον αυτό του ζητηθεί.
Επεξήγηση όρων χρήσης έργων τρίτων διαθέσιμο με άδεια CC-BY διαθέσιμο με άδεια CC-BY-SA διαθέσιμο με άδεια CC-BY-ND διαθέσιμο με άδεια CC-BY-NC διαθέσιμο με άδεια CC-BY-NC-SA διαθέσιμο με άδεια CC-BY-NC-ND διαθέσιμο με άδεια CC0 Public Domain διαθέσιμο ως κοινό κτήμα χωρίς σήμανση Δεν επιτρέπεται η επαναχρησιμοποίηση του έργου, παρά μόνο εάν ζητηθεί εκ νέου άδεια από το δημιουργό. Επιτρέπεται η επαναχρησιμοποίηση του έργου και η δημιουργία παραγώγων αυτού με απλή αναφορά του δημιουργού. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού, και διάθεση του έργου ή του παράγωγου αυτού με την ίδια άδεια. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η δημιουργία παραγώγων του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η εμπορική χρήση του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού και διάθεση του έργου ή του παράγωγου αυτού με την ίδια άδεια. Δεν επιτρέπεται η εμπορική χρήση του έργου. Επιτρέπεται η επαναχρησιμοποίηση του έργου με αναφορά του δημιουργού. Δεν επιτρέπεται η εμπορική χρήση του έργου και η δημιουργία παραγώγων του. Επιτρέπεται η επαναχρησιμοποίηση του έργου, η δημιουργία παραγώγων αυτού και η εμπορική του χρήση, χωρίς αναφορά του δημιουργού. Επιτρέπεται η επαναχρησιμοποίηση του έργου, η δημιουργία παραγώγων αυτού και η εμπορική του χρήση, χωρίς αναφορά του δημιουργού. Συνήθως δεν επιτρέπεται η επαναχρησιμοποίηση του έργου.
Διατήρηση Σημειωμάτων Οποιαδήποτε αναπαραγωγή ή διασκευή του υλικού θα πρέπει να συμπεριλαμβάνει: το Σημείωμα Αναφοράς το Σημείωμα Αδειοδότησης τη δήλωση Διατήρησης Σημειωμάτων το Σημείωμα Χρήσης Έργων Τρίτων (εφόσον υπάρχει) μαζί με τους συνοδευόμενους υπερσυνδέσμους.
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ιονίων Νήσων» έχει χρηματοδοτήσει μόνο την αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.