Διαφορά μεταξύ αφηρημένης κλάσης και διεπαφής
Abstract Class vs Interface
Η αφηρημένη κλάση και η διεπαφή είναι δύο αντικειμενοστρεφείς κατασκευές που βρίσκονται σε πολλές αντικειμενοστραφείς γλώσσες προγραμματισμού όπως η Java. Η αφηρημένη κλάση μπορεί να θεωρηθεί ως μια αφηρημένη έκδοση μιας τακτικής (συγκεκριμένης) τάξης, ενώ μια διεπαφή μπορεί να θεωρηθεί ως μέσο υλοποίησης μιας σύμβασης. Η αφηρημένη κλάση είναι μια κλάση που δεν μπορεί να αρχικοποιηθεί αλλά μπορεί να επεκταθεί. Η διεπαφή είναι ένας τύπος που πρέπει να εφαρμοστεί από άλλες κατηγορίες. Στην Java, τα αφηρημένα μαθήματα δηλώνονται χρησιμοποιώντας την λέξη Αφηρημένη, ενώ η λέξη-κλειδί διεπαφής χρησιμοποιείται για τον ορισμό μιας διεπαφής.
Τι είναι μια αφηρημένη κλάση;
Συνήθως, οι αφηρημένες κλάσεις, γνωστές και ως Αφηρημένες κλάσεις βάσης (ABC), δεν μπορούν να παρουσιαστούν (δεν είναι δυνατή η δημιουργία μιας εμφάνισης αυτής της κλάσης). Έτσι, οι κλάσεις Abstract έχουν νόημα μόνο αν η γλώσσα προγραμματισμού υποστηρίζει την κληρονομικότητα (δυνατότητα δημιουργίας υποκατηγοριών από την επέκταση μιας κλάσης). Τα αφηρημένα μαθήματα αντιπροσωπεύουν συνήθως μια αφηρημένη έννοια ή οντότητα με μερική ή μη εφαρμογή. Επομένως, οι κλάσεις αφηρημένων λειτουργούν ως κλάσεις γονέων από τις οποίες προέρχονται κλάσεις παιδιών, έτσι ώστε η τάξη των παιδιών να μοιράζεται τα ελλιπή χαρακτηριστικά της γονικής τάξης και να μπορούν να προστεθούν λειτουργικότητες για την ολοκλήρωσή τους.
Τα αφηρημένα μαθήματα μπορεί να περιέχουν αφηρημένες μεθόδους. Υποκατηγορίες που επεκτείνουν μια αφηρημένη κλάση μπορούν να εφαρμόσουν αυτές τις (κληρονομικές) αφηρημένες μεθόδους. Εάν η τάξη των παιδιών εφαρμόζει όλες αυτές τις αφηρημένες μεθόδους, είναι μια συγκεκριμένη τάξη. Αλλά αν όχι, η τάξη των παιδιών γίνεται επίσης μια κατηγορία Abstract. Αυτό σημαίνει ότι όταν ο προγραμματιστής ορίζει μια τάξη ως Περίληψη, λέει ότι η τάξη θα είναι ατελής και θα έχει στοιχεία που πρέπει να συμπληρωθούν από τις κληρονομικές υποκλάσεις. Αυτός είναι ένας καλός τρόπος για να δημιουργηθεί μια σύμβαση μεταξύ δύο προγραμματιστών, η οποία απλοποιεί τα καθήκοντα στην ανάπτυξη λογισμικού. Ο προγραμματιστής, ο οποίος γράφει κώδικα για να κληρονομήσει, πρέπει να ακολουθήσει ακριβώς τους ορισμούς των μεθόδων (αλλά φυσικά μπορεί να έχει και τη δική του εφαρμογή).
Τι είναι μια διεπαφή;
Μια διεπαφή είναι ένας αφηρημένος τύπος που χρησιμοποιείται για να καθορίσει μια σύμβαση που θα πρέπει να εφαρμοστεί από τάξεις, οι οποίες υλοποιούν αυτή τη διεπαφή. Η λέξη-κλειδί διεπαφής χρησιμοποιείται για τον ορισμό διεπαφής και η λέξη-κλειδί Implements χρησιμοποιείται για την υλοποίηση μιας διασύνδεσης από μια τάξη (σε γλώσσα προγραμματισμού Java). Συνήθως, μια διεπαφή θα περιέχει μόνο υπογραφές μεθόδων και σταθερές δηλώσεις. Κάθε διεπαφή που υλοποιεί μια συγκεκριμένη διεπαφή θα πρέπει να εφαρμόζει όλες τις μεθόδους που ορίζονται στη διεπαφή ή θα πρέπει να δηλώνεται ως αφηρημένη κλάση. Στην Java, ο τύπος μιας αναφοράς αντικειμένου μπορεί να οριστεί ως ένας τύπος διεπαφής. Αλλά αυτό το αντικείμενο πρέπει είτε να είναι null είτε να κρατά ένα αντικείμενο μιας κλάσης, το οποίο υλοποιεί τη συγκεκριμένη διεπαφή.Χρησιμοποιώντας τη λέξη-κλειδί Implements στη Java, μπορείτε να εφαρμόσετε πολλαπλές διασυνδέσεις σε μια μόνο κλάση.
Ποια είναι η διαφορά μεταξύ της Αφηρημένης Κατηγορίας και της Διεπαφής;
Τα αφηρημένα μαθήματα αντιπροσωπεύουν συνήθως μια αφηρημένη έννοια ή μια οντότητα με μερική ή μη εφαρμογή. Από την άλλη πλευρά, μια διεπαφή είναι ένας αφηρημένος τύπος που χρησιμοποιείται για να καθορίσει μια σύμβαση που θα πρέπει να εφαρμοστεί από τάξεις. Οι αφηρημένες τάξεις θα πρέπει να κληρονομούνται (ή να επεκτείνονται), ενώ θα πρέπει να εφαρμόζονται διεπαφές. Οι αφηρημένες τάξεις μπορούν να περιέχουν αφηρημένες μεθόδους, ενώ μια διεπαφή πρέπει να περιέχει μόνο αφηρημένες μεθόδους. Οι αφηρημένες κλάσεις μπορούν να περιέχουν οποιεσδήποτε μεταβλητές, αλλά οι διεπαφές μπορούν να ορίζουν μόνο σταθερές. Μια κλάση δεν μπορεί να κληρονομήσει από περισσότερες από μία αφηρημένες κλάσεις, αλλά μπορεί να εφαρμόσει πολλαπλές διεπαφές. Μια διεπαφή δεν μπορεί να υλοποιήσει άλλη διεπαφή. Ωστόσο, μια διεπαφή μπορεί να επεκτείνει μια κλάση.