Εικονικό vs Abstract
Εικονικό και Abstract είναι δύο λέξεις-κλειδιά που χρησιμοποιούνται στις περισσότερες αντικειμενοστρεφείς γλώσσες προγραμματισμού (OO) όπως η Java και η C. Αν και υπάρχουν μικρές διαφορές στο τι σημαίνει σε διαφορετικές γλώσσες, τόσο οι εικονικές όσο και οι αφηρημένες λέξεις-κλειδιά παρέχουν μια αίσθηση μερικής εφαρμογής στις οντότητες στις οποίες συνδέεται.
Περίληψη
Τυπικά, οι Abstract classes, γνωστές και ως Abstract Base Classes (ABC), δεν μπορούν να δημιουργηθούν (δεν μπορεί να δημιουργηθεί μια παρουσία αυτής της κλάσης). Έτσι, οι τάξεις Abstract έχουν νόημα μόνο εάν η γλώσσα προγραμματισμού υποστηρίζει κληρονομικότητα (ικανότητα δημιουργίας υποκλάσεων από την επέκταση μιας κλάσης). Οι αφηρημένες κλάσεις συνήθως αντιπροσωπεύουν μια αφηρημένη έννοια ή οντότητα με μερική ή καθόλου υλοποίηση. Επομένως, οι Abstract classes λειτουργούν ως γονικές κλάσεις από τις οποίες προέρχονται οι θυγατρικές κλάσεις, έτσι ώστε η θυγατρική κλάση θα μοιράζεται τα ημιτελή χαρακτηριστικά της γονικής κλάσης και η λειτουργικότητα μπορεί να προστεθεί για την ολοκλήρωσή τους. Οι αφηρημένες κλάσεις μπορεί να περιέχουν Abstract μεθόδους. Οι υποκλάσεις που επεκτείνουν μια αφηρημένη κλάση μπορούν να εφαρμόσουν αυτές τις (κληρονομημένες) Αφηρημένες μεθόδους. Εάν η θυγατρική κλάση υλοποιεί όλες αυτές τις Abstract μεθόδους, είναι μια συγκεκριμένη κλάση. Αλλά αν δεν το κάνει, η παιδική τάξη γίνεται επίσης μια τάξη Abstract. Αυτό που σημαίνει όλα αυτά είναι ότι, όταν ο προγραμματιστής ορίζει μια κλάση ως Abstract, λέει ότι η κλάση θα είναι ημιτελής και θα έχει στοιχεία που πρέπει να συμπληρωθούν από τις υποκλάσεις κληρονομιάς. Αυτός είναι ένας ωραίος τρόπος για να δημιουργήσετε ένα συμβόλαιο μεταξύ δύο προγραμματιστών, που απλοποιεί τις εργασίες στην ανάπτυξη λογισμικού. Ο προγραμματιστής, ο οποίος γράφει κώδικα για να κληρονομήσει, πρέπει να ακολουθήσει επακριβώς τους ορισμούς της μεθόδου (αλλά φυσικά μπορεί να έχει τη δική του υλοποίηση). Σε Java και C, οι τάξεις και οι μέθοδοι Abstract δηλώνονται χρησιμοποιώντας τη λέξη-κλειδί Abstract.
Εικονικό
Οι εικονικές μέθοδοι/συναρτήσεις παρέχουν τη δυνατότητα προαιρετικής παράκαμψης της συμπεριφοράς της από μια κλάση κληρονομιάς (χρησιμοποιώντας μια συνάρτηση με την ίδια υπογραφή). Η έννοια της εικονικής συνάρτησης είναι σημαντική στο παρακάτω σενάριο. Ας υποθέσουμε ότι μια κλάση προέρχεται από μια θυγατρική κλάση, τότε όποτε χρησιμοποιείται ένα αντικείμενο της παραγόμενης κλάσης, μπορεί να αναφέρεται σε ένα αντικείμενο της βασικής κλάσης ή της παραγόμενης κλάσης. Ωστόσο, η συμπεριφορά κλήσης μεθόδου μπορεί να είναι ασαφής εάν οι μέθοδοι της βασικής κλάσης παρακαμφθούν. Έτσι, για να επιλυθεί αυτή η ασάφεια, χρησιμοποιείται η εικονική λέξη-κλειδί. Εάν η μέθοδος επισημαίνεται Virtual, τότε καλείται η συνάρτηση της παραγόμενης κλάσης (αν υπάρχει) ή αλλιώς η συνάρτηση της βασικής κλάσης. Για παράδειγμα, στη C++, η εικονική λέξη-κλειδί χρησιμοποιείται ακριβώς για αυτόν τον σκοπό. Στην C, η λέξη-κλειδί Virtual χρησιμοποιείται με παρόμοιο τρόπο, αλλά επιπλέον, η παράκαμψη λέξης-κλειδιού θα πρέπει να χρησιμοποιείται για την τροποποίηση όλων των μεθόδων που έχουν παρακαμφθεί. Αλλά στην Java, δεν υπάρχει ρητή εικονική λέξη-κλειδί. Όλες οι μη στατικές μέθοδοι θεωρούνται Εικονικές. Οι εικονικές συναρτήσεις χωρίς σώμα ονομάζονται καθαρές εικονικές συναρτήσεις. Σε Java και C, οι μέθοδοι Abstract είναι στην πραγματικότητα καθαρά εικονικές.
Διαφορά μεταξύ εικονικής και αφηρημένης
Αν και το Abstract και το Virtual είναι δύο λέξεις-κλειδιά/έννοιες που παρέχουν ένα νόημα ατελούς υλοποίησης στις συσχετισμένες οντότητες, έχουν τις διαφορές τους. Οι αφηρημένες μέθοδοι (που πρέπει να ορίζονται μέσα στις κλάσεις Abstract) δεν έχουν καθόλου υλοποίηση, ενώ οι εικονικές μέθοδοι μπορεί να έχουν υλοποίηση. Εάν οι μέθοδοι Abstract επεκτείνονται από μια συγκεκριμένη κλάση, όλες οι κληρονομούμενες μέθοδοι Abstract πρέπει να εφαρμοστούν, ενώ οι κληρονομημένες μέθοδοι Virtual ενδέχεται να παρακαμφθούν ή να μην παρακαμφθούν.