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