Κληρονομικότητα vs Σύνθεση
Η κληρονομικότητα και η σύνθεση είναι δύο σημαντικές έννοιες που βρίσκονται στο OOP (Αντικειμενοστραφής Προγραμματισμός). Με απλά λόγια, τόσο το Composition όσο και το Inheritance ασχολούνται με την παροχή πρόσθετων ιδιοτήτων ή συμπεριφοράς σε μια κλάση. Η κληρονομικότητα είναι η ικανότητα μιας κλάσης να κληρονομεί ιδιότητες και συμπεριφορά από μια γονική κλάση επεκτείνοντάς την. Από την άλλη πλευρά, η Σύνθεση είναι η ικανότητα μιας κλάσης να περιέχει αντικείμενα διαφορετικών κλάσεων ως δεδομένα μέλους.
Τι είναι η κληρονομικότητα;
Όπως αναφέρθηκε παραπάνω, η κληρονομικότητα είναι η δυνατότητα μιας κλάσης να κληρονομεί ιδιότητες και συμπεριφορά από μια γονική κλάση επεκτείνοντάς την. Η κληρονομικότητα ουσιαστικά παρέχει επαναχρησιμοποίηση κώδικα επιτρέποντας την επέκταση των ιδιοτήτων και της συμπεριφοράς μιας υπάρχουσας κλάσης από μια κλάση που ορίστηκε πρόσφατα. Εάν η κλάση Α επεκτείνει τη Β, τότε η κλάση Β ονομάζεται γονική κλάση (ή υπερκλάση) και η κλάση Α ονομάζεται θυγατρική τάξη (ή παράγωγη κλάση/υποκλάση). Σε αυτό το παράδειγμα σεναρίου, η κλάση Α θα κληρονομήσει όλα τα δημόσια και προστατευμένα χαρακτηριστικά και μεθόδους της υπερκλάσης (Β). Η υποκλάση μπορεί προαιρετικά να παρακάμψει (παρέχει νέα ή εκτεταμένη λειτουργικότητα στις μεθόδους) τη συμπεριφορά που κληρονομήθηκε από τη γονική κλάση.
Η κληρονομικότητα αντιπροσωπεύει μια σχέση "is-a" στο OOP. Αυτό ουσιαστικά σημαίνει ότι το Α είναι επίσης ένα Β. Με άλλα λόγια, το Β μπορεί να είναι η κλάση με μια γενική περιγραφή μιας συγκεκριμένης οντότητας του πραγματικού κόσμου, αλλά το Α καθορίζει μια συγκεκριμένη εξειδίκευση. Σε ένα πραγματικό πρόβλημα προγραμματισμού, η κλάση Person θα μπορούσε να επεκταθεί για να δημιουργήσει την κλάση Employee. Αυτό λέγεται εξειδίκευση. Αλλά θα μπορούσατε επίσης να δημιουργήσετε πρώτα την κλάση Employee και στη συνέχεια να τη γενικεύσετε σε μια κλάση Person (δηλ.μι. γενίκευση). Σε αυτό το παράδειγμα, ο Υπάλληλος θα έχει όλες τις ιδιότητες και τη συμπεριφορά του Ατόμου (δηλαδή, ο Υπάλληλος είναι επίσης Πρόσωπο) και μπορεί να περιέχει και κάποιες πρόσθετες λειτουργίες (άρα, το άτομο δεν είναι Υπάλληλος).
Τι είναι Σύνθεση;
Σύνθεση είναι η ικανότητα μιας κλάσης να περιέχει αντικείμενα διαφορετικών κλάσεων ως δεδομένα μέλους. Για παράδειγμα, η κλάση Α θα μπορούσε να περιέχει ένα αντικείμενο της κλάσης Β ως μέλος. Εδώ, όλες οι δημόσιες μέθοδοι (ή συναρτήσεις) που ορίζονται στο Β μπορούν να εκτελεστούν εντός της κλάσης Α. Η κλάση Α γίνεται το κοντέινερ, ενώ η κλάση Β γίνεται η κλάση που περιέχει. Η σύνθεση αναφέρεται επίσης ως Containership. Σε αυτό το παράδειγμα, μπορεί να ειπωθεί ότι η κλάση Α αποτελείται από την κλάση Β. Στο OOP, η Σύνθεση αντιπροσωπεύει μια σχέση «έχει-α». Είναι σημαντικό να σημειωθεί ότι, παρόλο που το κοντέινερ έχει πρόσβαση για να εκτελέσει όλες τις δημόσιες μεθόδους της κλάσης που περιέχεται, δεν μπορεί να αλλάξει ή να παρέχει πρόσθετη λειτουργικότητα. Όταν πρόκειται για ένα πρόβλημα προγραμματισμού πραγματικού κόσμου, ένα αντικείμενο της κλάσης TextBox μπορεί να περιέχεται στην κλάση Form, και έτσι μπορεί να ειπωθεί ότι μια Φόρμα περιέχει ένα TextBox (ή εναλλακτικά, μια Φόρμα αποτελείται από ένα TextBox).
Ποια είναι η διαφορά μεταξύ κληρονομικότητας και σύνθεσης;
Αν και η κληρονομικότητα και η σύνθεση είναι δύο έννοιες OOP, είναι αρκετά διαφορετικές ως προς το τι επιτρέπουν στον προγραμματιστή να επιτύχει. Η κληρονομικότητα είναι η ικανότητα μιας κλάσης να κληρονομεί ιδιότητες και συμπεριφορά από μια μητρική κλάση επεκτείνοντάς την, ενώ η Σύνθεση είναι η ικανότητα μιας κλάσης να περιέχει αντικείμενα διαφορετικών κλάσεων ως δεδομένα μέλους. Εάν μια κλάση επεκταθεί, κληρονομεί όλες τις δημόσιες και προστατευμένες ιδιότητες/συμπεριφορά και αυτές οι συμπεριφορές ενδέχεται να παρακαμφθούν από την υποκλάση. Αλλά εάν μια κλάση περιέχεται σε μια άλλη, το κοντέινερ δεν έχει τη δυνατότητα να αλλάξει ή να προσθέσει συμπεριφορά στο περιεχόμενο. Η κληρονομικότητα αντιπροσωπεύει μια σχέση "is-a" στο OOP, ενώ η σύνθεση αντιπροσωπεύει μια σχέση "has-a".