java:abstract_classes_vs_interfaces

Συγκρίνοντας Abstract Κλάσεις και Interfaces

Σε αυτή τη σελίδα συγκρίνουμε τις διαφορές Abstract Κλάσεων και Διεπαφών (Interfaces). Όπως έχουμε δει μέχρι τώρα μία κλάση μπορεί να υλοποιεί ένα Interface ή να κληρονομεί μία Abstract κλάση. Ποιες είναι όμως οι διαφορές μεταξύ των δύο προσεγγίσεων;

Χαρακτηριστικό Interface Abstract Class
Multiple Inheritance Μία κλάση μπορεί να κληρονομεί πολλαπλά interfaces Μία κλάση μπορεί να κληρονομεί μόνο μία abstract κλάση
Default implementation Στην Java 8 και μεταγενέστερα ένα interface μπορεί να παρέχει μία default υλοποίηση. Καθώς ένα interface δεν μπορεί να περιέχει πεδία, η πιθανή default υλοποίηση ενός interface θα πρέπει να είναι ανεξάρτητη των πεδίων της κλάσης Μία abstract κλάση μπορεί να παρέχει default υλοποίηση, η οποία όμως έχει πρόσβαση στα εσωτερικά δεδομένα της κλάσης
Πεδία Ένα Interface μπορεί να περιέχει μόνο σταθερές δηλ μεταβλητές που είναι static και final Μία Abstract κλάση μπορεί να περιέχει static, static final και non-static (κανονικές) μεταβλητές
Περιοριστές πρόσβασης Σε ένα interface όλες οι δηλώσεις θεωρούνται public Μία abstract κλάση μπορεί να έχει επιμέρους προσδιοριστές πρόσβασης για τα πεδία και τις μεθόδους της, όπως public, protected, package-private, private.
Λειτουργικότητα Ένα interface χρησιμοποιείται για να δηλώσει την εξωτερική διεπαφή μίας κλάσης με άλλες κλάσεις Μία abstract κλάση μπορεί να δηλώσει τόσο της εξωτερική διεπαφή, όσο και λεπτομέρειες της εσωτερικής υλοποίησης
Χρήση Εάν διαφορετικές υλοποιήσεις κλάσεων χρησιμοποιούν τις ίδιες μεθόδους για την διεπαφή τους με άλλες κλάσεις τότε ένα interface θεωρείται κατάλληλο για να δηλώσει τα κοινά τους χαρακτηριστικά. Εάν διαφορετικές υλοποιήσεις κλάσεων έχουν κοινά χαρακτηριστικά που αφορούν την εσωτερική τους κατάσταση (π.χ. κοινές μεταβλητές) τότε η χρήση μίας abstract κλάσης ως κοινός πρόγονος είναι η σωστότερη επιλογή.
Ταχύτητα Λιγότερο ταχύ Ταχύτερο
Επεκτασιμότητα Θεωρείται κακή προγραμματιστική πρακτική η επέκταση ενός Interface. Ένα Interface δεν θα πρέπει να σχεδιάζεται με γνώμονα την μελλοντική του επέκταση. Μία abstract κλάση μπορεί να αλλάξει την υλοποίηση της και να επεκταθεί, αρκεί να περιέχει default υλοποιήσεις για τις νέες μεθόδους που ορίζει.
java/abstract_classes_vs_interfaces.txt · Last modified: 2019/04/05 17:34 by gthanos