Συνιστάται, 2024

Επιλογή Συντάκτη

Διαφορά μεταξύ κληρονομικότητας και πολυμορφισμού

Η κληρονομικότητα επιτρέπει την επαναχρησιμοποίηση κώδικα και ο πολυμορφισμός είναι η εμφάνιση μιας λειτουργίας με διαφορετική μορφή. Η βασική διαφορά μεταξύ κληρονομικότητας και πολυμορφισμού είναι ότι η κληρονομιά επιτρέπει την επαναχρησιμοποίηση του ήδη υπάρχοντος κώδικα σε ένα πρόγραμμα και ο πολυμορφισμός παρέχει έναν μηχανισμό για να αποφασίσει δυναμικά ποια μορφή μιας συνάρτησης πρέπει να επικαλεσθεί.

Συγκριτικό διάγραμμα

Βάση σύγκρισηςΚληρονομίαΠολυμορφισμός
ΒασικόςΗ κληρονομιά δημιουργεί μια νέα τάξη χρησιμοποιώντας τις ιδιότητες της ήδη υπάρχουσας κλάσης.Ο πολυμορφισμός είναι βασικά μια κοινή διεπαφή για πολλαπλές μορφές.
ΕκτέλεσηΗ κληρονομιά βασικά εφαρμόζεται στις τάξεις.Ο πολυμορφισμός βασικά εφαρμόζεται σε λειτουργία / μεθόδους.
ΧρήσηΓια να υποστηρίξει την έννοια της επαναχρησιμοποίησης σε OOP και μειώνει το μήκος του κώδικα.Επιτρέπει στο αντικείμενο να αποφασίσει ποια μορφή της συνάρτησης πρέπει να επικαλείται όταν, κατά τον χρόνο μεταγλώττισης (υπερφόρτωση) καθώς και τον χρόνο εκτέλεσης (overriding).
ΈντυπαΗ κληρονομιά μπορεί να είναι μία κληρονομιά, πολλαπλή κληρονομιά, πολυεπίπεδη κληρονομιά, ιεραρχική κληρονομιά και υβριδική κληρονομιά.Ο πολυμορφισμός μπορεί να είναι ένας πολύμορφος χρόνος μεταγλώττισης (υπερφόρτωση) ή πολυμορφισμός χρόνου εκτέλεσης (overriding).
ΠαράδειγμαΤο «τραπέζι» της τάξης μπορεί να κληρονομήσει το χαρακτηριστικό της κατηγορίας «έπιπλα», καθώς ένας «πίνακας» είναι ένα «έπιπλο».Η κλάση 'study_table' μπορεί επίσης να έχει τη συνάρτηση 'set_color ()' και μια κλάση 'Dining_table' μπορεί επίσης να έχει τη συνάρτηση 'set_color ()' έτσι η μορφή της συνάρτησης set_color χρόνο εκτέλεσης.

Ορισμός κληρονομίας:

Η κληρονομιά είναι ένα από τα βασικά χαρακτηριστικά του OOP, το οποίο υποστηρίζει έντονα την "επαναχρησιμοποίηση". Η επαναχρησιμοποίηση θα μπορούσε να περιγραφεί ως δημιουργία μιας νέας κλάσης με επαναχρησιμοποίηση των ιδιοτήτων της υπάρχουσας κλάσης. Στην κληρονομιά, υπάρχει μια βασική τάξη, η οποία κληρονομείται από την παράγωγη τάξη. Όταν μια τάξη κληρονομεί οποιαδήποτε άλλη τάξη, το (τα) μέλος (-α) της βασικής τάξης γίνεται το (τα) μέλος (-α) μιας παράγωγης τάξης.

Η γενική μορφή της κληρονομιάς μιας τάξης είναι η εξής:

 class derived-class-name: προσδιοριστής πρόσβασης βάση-class-name {// body της κλάσης}; 

Εδώ, ο προσδιοριστής πρόσβασης παρέχει τον τρόπο πρόσβασης (ιδιωτικό, δημόσιο, προστατευμένο) στα μέλη της κλάσης βάσης στην κλάση που παράγεται. Εάν δεν υπάρχει προδιαγραφέας πρόσβασης, από προεπιλογή, θεωρείται ως "ιδιωτική". Στην C ++, αν η παράγωγη κλάση είναι "struct" τότε ο προσδιοριστής πρόσβασης είναι "δημόσια" από προεπιλογή.

Στην C ++, η κληρονομικότητα μπορεί να επιτευχθεί σε πέντε μορφές. Μπορούν να ταξινομηθούν ως:

  • Μοναδική κληρονομιά (μόνο μία κατηγορία σούπερ)
  • Πολλαπλή κληρονομιά (πολλές υπερκλάσες)
  • Ιεραρχική κληρονομιά (μία σούπερ τάξη, πολλές υποκατηγορίες)
  • Πολλαπλή κληρονομιά (που προέρχεται από μια παράγωγη κλάση)

Στην Java, η κλάση κληρονομεί την άλλη τάξη χρησιμοποιώντας τη λέξη-κλειδί "extends". Στην Java, η βασική κλάση αναφέρεται ως σούπερ τάξη και η παράγωγη κλάση αναφέρεται ως υποκατηγορία. Μια υποκατηγορία δεν μπορεί να έχει πρόσβαση σε εκείνα τα μέλη της βασικής κλάσης, τα οποία δηλώνονται ως "ιδιωτικά". Η γενική μορφή που κληροδοτεί την τάξη στην Java είναι η ακόλουθη.

 class derived-class-name επεκτείνει το όνομα της βασικής κλάσης {// της κλάσης}. 

Η Java δεν υποστηρίζει την κληρονομιά της πολλαπλής κληρονομιάς, ενώ υποστηρίζει την πολυεπίπεδη ιεραρχία. Στην Java, μερικές φορές μια σούπερ τάξη μπορεί να θέλει να κρύψει τις λεπτομέρειες υλοποίησής της και κάνει κάποιο μέρος αυτών των δεδομένων «ιδιωτικό». Όπως και στην Java, μια υποκατηγορία δεν έχει πρόσβαση στα ιδιωτικά μέλη της υπερκλάσης και εάν μια υποκατηγορία θέλει να έχει πρόσβαση ή να προετοιμάσει αυτά τα μέλη, τότε η Java παρέχει μια λύση. Η υποκατηγορία μπορεί να παραπέμπει τα μέλη της άμεσης υπερκλάσης της χρησιμοποιώντας μια λέξη-κλειδί "super". Θυμηθείτε, μπορείτε να έχετε πρόσβαση μόνο στα μέλη της άμεσης υπερκλάσης.

Το «σούπερ» έχει δύο γενικές μορφές. Το πρώτο είναι, χρησιμοποιεί για να καλέσει τον κατασκευαστή της σούπερ τάξη. Το δεύτερο είναι η πρόσβαση στο μέλος της υπερκλάσης που έχει κρυφτεί από το μέλος της υποκατηγορίας.

 // πρώτη μορφή κλήσης του κατασκευαστή. class supper_class {supper_class (argument_list) {..} // κατασκευαστής super class}? class sub_class επεκτείνει το supper_class {sub_class (argument_list) {..} // κατασκευαστής του super_class super (argument_list); // sub_class καλεί τον κατασκευαστή της σούπερ τάξης}}. 
 // δευτερόλεπτο για την κατηγορία 'super' supper_class {int i; } class sub_class επεκτείνει το supper_class {int i; sub_class (int a, int b) {super.i = a; // 'i' της σούπερ κλάσης i = b; // 'i' της υποκατηγορίας}}. 

Ορισμός του πολυμορφισμού

Ο όρος πολυμορφισμός σημαίνει απλώς «μία λειτουργία, πολλαπλές μορφές». Ο πολυμορφισμός επιτυγχάνεται τόσο στον χρόνο σύνταξης όσο και στον χρόνο εκτέλεσης. Ο πολύμορφος χρόνος συλλογής επιτυγχάνεται μέσω της "υπερφόρτωσης", ενώ ο πολυμορφισμός χρόνου εκτέλεσης επιτυγχάνεται μέσω "υπερισχύουσας".

Ο πολυμορφισμός επιτρέπει στο αντικείμενο να αποφασίσει "ποια μορφή της συνάρτησης πρέπει να επικαλείται όταν" και στα δύο, να συνθέσει χρόνο και χρόνο εκτέλεσης.
Ας συζητήσουμε την πρώτη έννοια της υπερφόρτωσης. Στην υπερφόρτωση ορίζουμε μια συνάρτηση στην τάξη περισσότερο από μία φορά με διαφορετικό τύπο δεδομένων και τον αριθμό των παραμέτρων, ενώ η λειτουργία που πρέπει να υπερφορτωθεί πρέπει να έχει τον ίδιο τύπο επιστροφής. Οι περισσότερες φορές οι λειτουργίες για την υπερφορτωμένη είναι κατασκευαστές της κατηγορίας.

 τάξη υπερφόρτωσης {int a, b; δημόσιο: int υπερφόρτωση (int x) {// πρώτος υπερφόρτωση () constructor a = x; επιστροφή a; } int υπερφόρτωση (int x, int y) {// δεύτερη υπερφόρτωση () constructor a = x; b = y; επιστροφή a * b; }}. int main () {υπερφόρτιση O1; O1.περιοχή (20); // πρώτη υπερφόρτωση () κλήση κατασκευαστή κλήση O1.overload (20, 40); // δεύτερη υπερφόρτωση () κλήση κατασκευαστή} 

Τώρα, ας συζητήσουμε τη δεύτερη μορφή πολυμορφισμού, δηλαδή την υπερισχύει. Η έννοια της υπέρβασης μπορεί να εφαρμοστεί μόνο στη λειτουργία των τάξεων που εφαρμόζουν επίσης την έννοια της κληρονομιάς. Στην C ++, η λειτουργία που πρέπει να αντικατασταθεί προηγείται από τη λέξη-κλειδί "virtual" της κλάσης βάσης και επαναπροσδιορίζεται στην παράγωγη κλάση με το ίδιο πρωτότυπο εκτός από τη λέξη "virtual".

 class class {public: virtual void funct () {// εικονική λειτουργία της βασικής κλάσης cout << "Αυτή είναι η funct () της βασικής κλάσης"; }}. class derived1: δημόσια βάση {public: void funct () {// εικονική συνάρτηση της κατηγορίας βάσης επανακαθορισμένη στο derived1 class cout 

Βασικές διαφορές μεταξύ κληρονομιάς και πολυμορφισμού

  1. Η κληρονομιά δημιουργεί μια τάξη που παράγει το χαρακτηριστικό της από μια ήδη υπάρχουσα τάξη. Από την άλλη πλευρά, ο πολυμορφισμός είναι μια διεπαφή που μπορεί να οριστεί σε πολλαπλές μορφές.
  2. Η κληρονομικότητα εφαρμόζεται στις κλάσεις, ενώ ο πολυμορφισμός εφαρμόζεται σε μεθόδους / λειτουργίες.
  3. Δεδομένου ότι η κληρονομιά επιτρέπει σε μια παράγωγη κλάση να χρησιμοποιεί τα στοιχεία και τις μεθόδους που ορίζονται στην κλάση βάσης, η παράγωγη κλάση δεν χρειάζεται να καθορίσει αυτά τα στοιχεία ούτε να την χρησιμοποιήσει ξανά, έτσι μπορούμε να πούμε ότι αυξάνει την επαναχρησιμοποίηση κώδικα και επομένως μειώνει το μήκος του κώδικα . Από την άλλη πλευρά, ο πολυμορφισμός καθιστά δυνατό για ένα αντικείμενο να αποφασίσει ποια μορφή της μεθόδου θέλει να επικαλεσθεί τόσο στον χρόνο σύνταξης όσο και στον χρόνο εκτέλεσης.
  4. Η κληρονομιά μπορεί να ταξινομηθεί ως ενιαία κληρονομιά, πολλαπλή κληρονομιά, πολυεπίπεδη κληρονομιά, ιεραρχική κληρονομιά και υβριδική κληρονομιά. Από την άλλη πλευρά, ο πολυμορφισμός χαρακτηρίζεται ως υπερφόρτωση και υπερισχύει.

Συμπέρασμα:

Η κληρονομιά και ο πολυμορφισμός είναι αλληλένδετες έννοιες, καθώς ο δυναμικός πολυμορφισμός εφαρμόζεται στις τάξεις που εφαρμόζουν επίσης την έννοια της κληρονομιάς.

Top