1 / 63

ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ. Is-like-a inheritance. Θεματολόγιο. Κληρονομικότητα Παράδειγμα Κληρονομικότητα – Βελτιωμένο Παράδειγμα Ενθυλάκωση : public – private - protected πεδία Ενθυλάκωση : public – private - protected κληρονομικότητα Ανάθεση αντικειμένων και κληρονομικότητα

anana
Download Presentation

ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ Is-like-a inheritance

  2. Θεματολόγιο • Κληρονομικότητα • Παράδειγμα • Κληρονομικότητα – Βελτιωμένο Παράδειγμα • Ενθυλάκωση : public – private - protected πεδία • Ενθυλάκωση : public – private - protected κληρονομικότητα • Ανάθεση αντικειμένων και κληρονομικότητα • Ανάθεση διευθύνσεων αντικειμένων σε δείκτες και κληρονομικότητα • Πέρασμα παραμέτρων και κληρονομικότητα • Άλλα θέματα

  3. Παράδειγμα • Έστω ένα απλό πρόγραμμα που διαχειρίζεται πληροφορίες για τους πελάτες και τους υπαλλήλους μιας εταιρίας….

  4. Παράδειγμα # include <iostream> # include <cstring> using namespace std; classEmployee { private: char fname[40]; char lname[40]; int basicSalary; public: Employee(charfn[], char ln[], int sal); int getSalary(); char *getPersonalDetails(); };

  5. Παράδειγμα classCustomer { private: char fname[40]; char lname[40]; int credit; char creditType[10]; public: Customer(charfn[], char ln[], char ct[]); void chargeCredit(intamount); char *getPersonalDetails(); int getCredit(); };

  6. Παράδειγμα Employee::Employee(charfn[], char ln[], int sal){ strcpy(fname, fn); strcpy(lname, ln); basicSalary = sal; } int Employee::getSalary(){ return basicSalary; } char *Employee::getPersonalDetails(){ char *ret = new char [strlen(fname) + strlen(lname)+40]; sprintf(ret, “1stName %s -LastName %s", fname, lname); return ret; }

  7. Παράδειγμα Customer::Customer(charfn[], char ln[], char ct[]){ strcpy(fname, fn); strcpy(lname, ln); strcpy(creditType, ct); credit = 0; } void Customer::chargeCredit(intamount){ credit -= amount; } char *Customer::getPersonalDetails(){ char *ret = new char [strlen(fname) + strlen(lname)+40]; sprintf(ret, “1stName %s -LastName %s", fname, lname); return ret; } int Customer::getCredit(){ return credit; }

  8. Παράδειγμα int main(){ char fname[40]; char lname[40]; int sal; int credit; cin >> fname >> lname >> sal; Employeejohn(fname, lname, sal); cin >> fname >> lname; Customerpet(fname, lname, "VISA"); char *details = john.getPersonalDetails(); sal = john.getSalary(); cout << details << " - Salary : " << sal<< endl; delete [] details; pet.chargeCredit(250); }

  9. Παράδειγμα • Η υπάρχουσα σχεδίαση και υλοποίηση με τις 2 κλάσεις είναι προβληματική μια που οι δύο έννοιες (υπάλληλος, πελάτης) έχουν κάποια κοινά χαρα-κτηριστικά και κώδικα ο οποίος επαναλαμβάνεται. • Γενικά αυτό δεν διευκολύνει τη συντήρηση …

  10. Παράδειγμα # include <iostream> # include <cstring> using namespace std; classEmployee { private: char fname[40]; char lname[40]; int basicSalary; public: Employee(charfn[], char ln[], int sal); int getSalary(); char *getPersonalDetails(); };

  11. Παράδειγμα classCustomer { private: char fname[40]; char lname[40]; int credit; char creditType[10]; public: Customer(charfn[], char ln[], char ct[]); void chargeCredit(intamount); char *getPersonalDetails(); int getCredit(); };

  12. Παράδειγμα Employee::Employee(charfn[], char ln[], int sal){ strcpy(fname, fn); strcpy(lname, ln); basicSalary = sal; } int Employee::getSalary(){ return basicSalary; } char *Employee::getPersonalDetails(){ char *ret = new char [strlen(fname) + strlen(lname)+40]; sprintf(ret, “1stName %s -LastName %s", fname, lname); return ret; }

  13. Παράδειγμα Customer::Customer(charfn[], char ln[], char ct[]){ strcpy(fname, fn); strcpy(lname, ln); strcpy(creditType, ct); credit = 0; } void Customer::chargeCredit(intamount){ credit -= amount; } char *Customer::getPersonalDetails(){ char *ret = new char [strlen(fname) + strlen(lname)+40]; sprintf(ret, “1stName %s -LastName %s", fname, lname); return ret; } int Customer::getCredit(){ return credit; }

  14. Παράδειγμα int main(){ char fname[40]; char lname[40]; int sal; int credit; cin >> fname >> lname >> sal; Employeejohn(fname, lname, sal); cin >> fname >> lname; Customerpet(fname, lname, "VISA"); char *details = john.getPersonalDetails(); sal = john.getSalary(); cout << details << " - Salary : " << sal<< endl; delete [] details; pet.chargeCredit(250); }

  15. Κληρονομικότητα • Το πρόβλημα: • Σε πολλές εφαρμογές έχουμε διάφορες κλάσεις αντικειμένων οι οποίες έχουν κοινά χαρακτηριστικά/πεδία και μεθόδους • πχ. τόσο οι εργαζόμενοι όσο και οι πελάτες μιας εταιρίας χαρακτηρίζονται από ένα όνομα, επίθετο, κλπ…. • ένα σφάλμα μπορεί να εισαχθεί σε πολλά διαφορετικά σημεία • μια αλλαγή θα πρέπει να γίνει σε πολλά σημεία • μια διόρθωση, ένας έλεγχος θα πρέπει να γίνει σε πολλά σημεία

  16. Κληρονομικότητα • Για καλύτερη οργάνωση και συντήρηση του κώδικα (για να μην επαναλαμβάνεται ο ίδιος κώδικας πολλές φορές) • φτιάχνουμε μια γενική/βασική κλάση που να περιλαμβάνει τα κοινά χαρακτηριστικά/πεδία και μεθόδους δύο ή περισσοτέρων κλάσεων και • εν συνεχεία επεκτείνουμε τη βασική φτιάχνοντας κλάσεις που κληρονομούν από αυτή.

  17. Κληρονομικότητα • Τι σημαίνει επέκταση... • Στις παραγόμενες κλάσεις δηλώνουμε επιπλέον χαρα-κτηριστικά και λειτουργίες. • Τα αντικείμενα έχουν όλα τα χαρακτηριστικά και λειτουργίες που δηλώνονται στην βασική κλάση, • καθώς και τα επιπλέον χαρακτηριστικά και λειτουργίες που δηλώνονται στην παραγόμενη κλάση • Κατά τη δημιουργία τους πρώτα εκτελείται ο κώδικας του constructor της βασικής κλάσης και εν συνεχεία εκτελείται ο κώδικας του constructor της παραγόμε-νης κλάσης. • Οι destructorsκαλούνται με την αντίστροφή σειρά….

  18. Κληρονομικότητα • Τα αντικείμενα των παραγόμενων κλάσεων συμπεριφέρονται και ως αντικείμενα της βασικής κλάσης (π.χ. στο πέρασμα παραμέτρων) • Η επέκταση ονομάζεται και σχέση IS_LIKE_A («είναισαν»).

  19. Βελτιωμένο Παράδειγμα # include <iostream> # include <cstring> using namespace std; classPerson { private: char fname[40]; char lname[40]; public: Person(charfn[], char ln[]); ~Person(); char *getPersonalDetails(); };

  20. Βελτιωμένο Παράδειγμα Person::Person(charfn[], char ln[]){ strcpy(fname, fn); strcpy(lname, ln); } Person::~Person(){ cout << “~Person() called\n”; } char *Person::getPersonalDetails(){ char *ret = new char [strlen(fname) + strlen(lname) +40]; sprintf(ret, “1stName %s -LastName %s", fname, lname); return ret; }

  21. Βελτιωμένο Παράδειγμα classEmployee : publicPerson { private: int basicSalary; public: Employee(charfn[], char ln[], int sal); ~Employee(); int getSalary(); }; Employee::Employee(charfn[], char ln[], int sal) : Person(fn, ln) { basicSalary = sal; } Employee::~Employee(){ cout << “~Employee() called”; } int Employee::getSalary(){ return basicSalary; }

  22. Βελτιωμένο Παράδειγμα classCustomer : publicPerson { private: int credit; char creditType[10]; public: Customer(charfn[], char ln[], char ct[]); ~Customer(); void chargeCredit(intamount); int getCredit(); }; Customer::Customer(charfn[], char ln[], char ct[]) : Person(fn, ln) { credit = 0; strcpy(creditType, ct);} Customer::~Customer(){ cout << “~Customer called\n”; } void Customer::chargeCredit(intamount){ credit -= amount;} int Customer::getCredit(){ return credit;}

  23. Βελτιωμένο Παράδειγμα int main(){ char fname[40]; char lname[40]; int sal; int credit; cin >> fname >> lname >> sal; Employeejohn(fname, lname, sal); cin >> fname >> lname; Customerpet(fname, lname, "VISA"); char *details = john.getPersonalDetails(); sal = john.getSalary(); cout << details << " - Salary : " << sal<< endl; delete [] details; pet.chargeCredit(250); // οι destructors εκτελούνται αντίστροφα …. }

  24. ΕνθυλAκωση: public-private-protected πεΔΙακαι μΕθοδοι

  25. Κληρονομικότητα – Πεδία και Μέθοδοι • πεδία και μέθοδοι public: ορατά από όλους • αλλαγές / διορθώσεις μπορεί να επηρεάσουν τον υπόλοιπο κώδικα • πεδία και μέθοδοιprivate: ορατά από την υλοποίηση των μεθόδων της κλάσης • αλλαγές / διορθώσεις / έλεγχοι συγκεντρώνονται στον κώδικα της κλάσης και δεν επηρεάζουν τον υπόλοιπο κώδικα • πεδία και μέθοδοι protected: ορατά από • την υλοποίηση των μεθόδων της κλάσης, και επιπλέον από • την υλοποίηση των μεθόδων των κλάσεων που τα κληρονομούν • αλλαγές / διορθώσεις / έλεγχοι συγκεντρώνονται στον κώδικα της κλάσης • επηρεάζουν τον κώδικα των παραγόμενων κλάσεων • δεν επηρεάζουν τον υπόλοιπο κώδικα

  26. Παράδειγμα # include <iostream> # include <cstring> using namespace std; classPerson { private: char fname[40]; char lname[40]; public: Person(charfn[], char ln[]); char *getPersonalDetails(); }; τα private πεδία της βασικής δεν μπορούν να χρησιμοποιηθούν απευθείας στις παραγόμενες …ούτε βέβαια στον υπόλοιπο κώδικα…

  27. Παράδειγμα Person::Person(charfn[], char ln[]){ strcpy(fname, fn); strcpy(lname, ln); } char *Person::getPersonalDetails(){ char *ret = new char [strlen(fname)+ strlen(lname) +40]; sprintf(ret, “1stName %s -LastName %s", fname, lname); return ret; }

  28. Παράδειγμα classEmployee : publicPerson { private: int basicSalary; public: Employee(charfn[], char ln[], int sal); int getSalary(); }; Employee::Employee(charfn[], char ln[], int sal) : Person(fn, ln) { basicSalary = sal; // cout << “1st Name:"<<fname<<"-Last Name:"<<lname<< endl; // Compile error !! } int Employee::getSalary(){ return basicSalary; }

  29. Παράδειγμα classCustomer : publicPerson { private: int credit; char creditType[10]; public: Customer(charfn[], char ln[], char ct[]); void chargeCredit(intamount); int getCredit(); }; Customer::Customer(charfn[], char ln[], char ct[]) : Person(fn, ln) { credit = 0; strcpy(creditType, ct); } void Customer::chargeCredit(intamount){ credit -= amount; } int Customer::getCredit(){ return credit; }

  30. Παράδειγμα int main(){ char fname[40]; char lname[40]; int sal; int credit; cin >> fname >> lname >> sal; Employeejohn(fname, lname, sal); cin >> fname >> lname; Customerpet(fname, lname, "VISA"); char *details = john.getPersonalDetails(); sal = john.getSalary(); cout << details << " - Salary : " << sal<< endl; delete [] details; pet.chargeCredit(250); }

  31. Παράδειγμα - protected # include <iostream> # include <cstring> using namespace std; classPerson { protected: char fname[40]; char lname[40]; public: Person(charfn[], char ln[]); char *getPersonalDetails(); }; τα protectedπεδία της βασικής μπορούν να χρησιμοποιηθούν απευθείας στις παραγόμενες OXI όμως στον υπόλοιπο κώδικα !

  32. Παράδειγμα - protected Person::Person(charfn[], char ln[]){ strcpy(fname, fn); strcpy(lname, ln); } char *Person::getPersonalDetails(){ char *ret = new char [strlen(fname) + strlen(lname) +40]; sprintf(ret, “1stName %s - LastName %s", fname, lname); return ret; }

  33. Παράδειγμα - protected classEmployee : publicPerson { private: int basicSalary; public: Employee(charfn[], char ln[], int sal); int getSalary(); }; Employee::Employee(charfn[], char ln[], int sal) : Person(fn, ln) { basicSalary = sal; cout <<“1st Name:" <<fname<<"-Last Name:"<<lname <<endl; // ΟΚ ΝΟ Compile error !! } int Employee::getSalary(){ return basicSalary; }

  34. Παράδειγμα - protected classCustomer : publicPerson { private: int credit; char creditType[10]; public: Customer(charfn[], char ln[], char ct[]); void chargeCredit(intamount); int getCredit(); }; Customer::Customer(charfn[], char ln[], char ct[]) : Person(fn, ln) { credit = 0; strcpy(creditType, ct); } void Customer::chargeCredit(intamount){ credit -= amount; } int Customer::getCredit(){ return credit; }

  35. Παράδειγμα - protected int main(){ char fname[40]; char lname[40]; int sal; int credit; cin >> fname >> lname >> sal; Employeejohn(fname, lname, sal); cin >> fname >> lname; Customerpet(fname, lname, "VISA"); char *details = john.getPersonalDetails(); sal = john.getSalary(); cout << details << " - Salary : " << sal<< endl; delete [] details; // cout << pet.fname; Compile error !!! fname protected pet.chargeCredit(250); }

  36. ΕνθυλΑκωση: public - private - protected κληρονομικΟτητα

  37. Public, private, protected κληρονομικότητα • Κληρονομικότητα με public: • τα πεδία και οι μέθοδοι της βασικής κλάσης διατηρούν τους περιορισμούς εμβέλειας που έχουν • για όλους όσους χρησιμοποιούν αντικείμενα της παραγόμενης κλάσηςX, • καθώς και για κλάσεις Z, K, L, που κληρονομούν από την παραγόμενη κλάση.

  38. Κλάσεις και εμβέλεια • Κληρονομικότητα με private: • τα publicκαι protectedπεδία και οι μέθοδοι της βασικής κλάσης X γίνονται private • για όλους όσους χρησιμοποιούν αντικείμενα της παραγόμενης κλάσης Y, • καθώς και για κλάσεις Z, K, L, που κληρονομούν από την παραγόμενη κλάση. • Για την ίδια την παραγόμενη κλάση Y οι περιορισμοί εμβέλειας παραμένουν ως έχουν δηλωθεί στην βασική κλάση X. • => χρήσιμο για διευκόλυνση της συντήρησης • αν αλλάξουμε μια public μέθοδο μιας βασικής κλάσης και • έχουμε ένα κώδικα που χρησιμοποιεί αντικείμενα μιας παραγόμενης κλάσης που προέκυψε με private κληρονομικότητα, • ξέρουμε ότι αυτός ο κώδικας δεν επηρεάζεται από την αλλαγή

  39. Παράδειγμα # include <iostream> # include <cstring> using namespace std; classPerson { protected: char fname[40]; char lname[40]; public: Person(charfn[], char ln[]); char *getPersonalDetails(); };

  40. Παράδειγμα classEmployee : privatePerson { private: int basicSalary; public: Employee(charfn[], char ln[], int sal); int getSalary(); }; classCustomer : privatePerson { private: int credit; char creditType[10]; public: Customer(charfn[], char ln[], char ct[]); void chargeCredit(intamount); int getCredit(); };

  41. Παράδειγμα class VIPCustomer : public Customer { private: int vipCode; public: VIPCustomer(char fn[], char ln[], char ct[], int code); int getVIPCode(); };

  42. Παράδειγμα Person::Person(charfn[], char ln[]){ strcpy(fname, fn); strcpy(lname, ln); } char *Person::getPersonalDetails(){ char *ret = new char [strlen(fname) + strlen(lname) +40]; sprintf(ret, “1stName %s -LastName %s", fname, lname); return ret; }

  43. Παράδειγμα Employee::Employee(charfn[], char ln[], int sal) : Person(fn, ln) { basicSalary = sal; cout << “1stName: " << fname <<"-LastName: " << lname << endl;// ok because protected cout << getPersonalDetails() <<endl;// ok because public } int Employee::getSalary(){ return basicSalary; }

  44. Παράδειγμα Customer::Customer(charfn[], char ln[], char ct[]) : Person(fn, ln) { credit = 0; strcpy(creditType, ct); } void Customer::chargeCredit(intamount){ credit -= amount; } int Customer::getCredit(){ return credit; }

  45. Παράδειγμα VIPCustomer::VIPCustomer(charfn[], char ln[],char ct[], int code) : Customer(fn, ln, ct){ vipCode = code; } int VIPCustomer::getVIPCode(){ //cout << getPersonalDetails(); // cout << fname << lname; // Compile error – public method BUT private inheritance return vipCode; }

  46. Παράδειγμα int main(){ char fname[40]; char lname[40]; int sal; int credit; cin >> fname >> lname >> sal; Employeejohn(fname, lname, sal); cin >> fname >> lname; Customerpet(fname, lname, “VISA”); // cout << john.getPersonalDetails() << endl; // Compile error – public method BUT private inheritance cout << "Salary : " << john.getSalary() << endl; pet.chargeCredit(250); return 1; }

  47. Κλάσεις και εμβέλεια (συνέχεια) • Κληρονομικότητα με protected: • τα publicπεδία και οι μέθοδοι της βασικής κλάσης X γίνονται protected • για όλους όσους χρησιμοποιούν αντικείμενα της παραγόμενης κλάσηςY. • καθώς και για κλάσεις Z, K, L, που κληρονομούν από την παραγόμενη κλάση. • Για την ίδια την παραγόμενη κλάση Y οι περιορισμοί εμβέλειας παραμένουν ως έχουν δηλωθεί στην βασική κλάση.

  48. Παράδειγμα # include <iostream> # include <cstring> using namespace std; classPerson { protected: char fname[40]; char lname[40]; public: Person(charfn[], char ln[]); char *getPersonalDetails(); };

  49. Παράδειγμα classEmployee : protectedPerson { private: int basicSalary; public: Employee(charfn[], char ln[], int sal); int getSalary(); }; classCustomer : protectedPerson { private: int credit; char creditType[10]; public: Customer(charfn[], char ln[], char ct[]); void chargeCredit(intamount); int getCredit(); };

  50. Παράδειγμα classVIPCustomer : publicCustomer { private: int vipCode; public: VIPCustomer(charfn[], char ln[], char ct[], int code); int getVIPCode(); };

More Related