java:abstract_classes_vs_interfaces

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
java:abstract_classes_vs_interfaces [2015/03/02 07:15]
gthanos
java:abstract_classes_vs_interfaces [2019/04/05 17:34] (current)
gthanos
Line 1: Line 1:
 ====== Συγκρίνοντας Abstract Κλάσεις και Interfaces ​ ====== ====== Συγκρίνοντας Abstract Κλάσεις και Interfaces ​ ======
  
-Σε αυτή τη σελίδα συγκρίνουμε τις διαφορές Abstract Κλάσεων και Διεπαφών (Interfaces). Όπως έχουμε δει μέχρι τώρα μία κλάση μπορεί να υλοποιεί ένα Interface ή να κληρονομεί μία Abstract κλάση. Ποιες είναι οι διαφορές μεταξύ των δύο προσεγγίσεων;​+Σε αυτή τη σελίδα συγκρίνουμε τις διαφορές Abstract Κλάσεων και Διεπαφών (Interfaces). Όπως έχουμε δει μέχρι τώρα μία κλάση μπορεί να υλοποιεί ένα Interface ή να κληρονομεί μία Abstract κλάση. Ποιες είναι ​όμως ​οι διαφορές μεταξύ των δύο προσεγγίσεων;​
  
 ^  Χαρακτηριστικό ​ ^  Interface ​ ^  Abstract Class  ^ ^  Χαρακτηριστικό ​ ^  Interface ​ ^  Abstract Class  ^
 | **Multiple Inheritance** | Μία κλάση μπορεί να κληρονομεί πολλαπλά interfaces | Μία κλάση μπορεί να κληρονομεί μόνο μία abstract κλάση | | **Multiple Inheritance** | Μία κλάση μπορεί να κληρονομεί πολλαπλά interfaces | Μία κλάση μπορεί να κληρονομεί μόνο μία abstract κλάση |
 | **Default implementation** | Στην Java 8 και μεταγενέστερα ένα interface μπορεί να παρέχει μία default υλοποίηση. Καθώς ένα interface δεν μπορεί να περιέχει πεδία, η πιθανή default υλοποίηση ενός interface θα πρέπει να είναι ανεξάρτητη των πεδίων της κλάσης | Μία abstract κλάση μπορεί να παρέχει default υλοποίηση,​ η οποία όμως έχει πρόσβαση στα εσωτερικά δεδομένα της κλάσης |  | **Default implementation** | Στην Java 8 και μεταγενέστερα ένα interface μπορεί να παρέχει μία default υλοποίηση. Καθώς ένα interface δεν μπορεί να περιέχει πεδία, η πιθανή default υλοποίηση ενός interface θα πρέπει να είναι ανεξάρτητη των πεδίων της κλάσης | Μία abstract κλάση μπορεί να παρέχει default υλοποίηση,​ η οποία όμως έχει πρόσβαση στα εσωτερικά δεδομένα της κλάσης | 
-| **Πεδία** | Ένα Interface μπορεί να περιέχει μόνο σταθερές δηλ μεταβλητές που είναι staticfinal | Μία Abstract κλάση μπορεί να περιέχει ​στατικές ​και μη στατικές μεταβλητές |+| **Πεδία** | Ένα Interface μπορεί να περιέχει μόνο σταθερές δηλ μεταβλητές που είναι static ​και ​final | Μία Abstract κλάση μπορεί να περιέχει ​static, static final και non-static (κανονικέςμεταβλητές |
 | **Περιοριστές πρόσβασης** | Σε ένα interface όλες οι δηλώσεις θεωρούνται //public// | Μία abstract κλάση μπορεί να έχει επιμέρους προσδιοριστές πρόσβασης για τα πεδία και τις μεθόδους της, όπως //public, protected, package-private,​ private//. | | **Περιοριστές πρόσβασης** | Σε ένα interface όλες οι δηλώσεις θεωρούνται //public// | Μία abstract κλάση μπορεί να έχει επιμέρους προσδιοριστές πρόσβασης για τα πεδία και τις μεθόδους της, όπως //public, protected, package-private,​ private//. |
 | **Λειτουργικότητα** | Ένα interface χρησιμοποιείται για να δηλώσει την εξωτερική διεπαφή μίας κλάσης με άλλες κλάσεις | Μία abstract κλάση μπορεί να δηλώσει τόσο της εξωτερική διεπαφή,​ όσο και λεπτομέρειες της εσωτερικής υλοποίησης | | **Λειτουργικότητα** | Ένα interface χρησιμοποιείται για να δηλώσει την εξωτερική διεπαφή μίας κλάσης με άλλες κλάσεις | Μία abstract κλάση μπορεί να δηλώσει τόσο της εξωτερική διεπαφή,​ όσο και λεπτομέρειες της εσωτερικής υλοποίησης |
-| **Χρήση** | Εάν διαφορετικές υλοποιήσεις κλάσεων χρησιμοποιούν τις ίδιες μεθόδους για την διεπαφή τους με άλλες κλάσεις τότε ένα interface θεωρείται κατάλληλο για να δηλώσει τα κοινά τους χαρακτηριστικά. ​ | Εάν διαφορετικές υλοποιήσεις κλάσεων έχουν κοινά χαρακτιριστικά που αφορούν την εσωτερική τους κατάσταση (π.χ. κοινές μεταβλητές) τότε η χρήση μίας abstract κλάσης ως κοινός πρόγονος είναι η σωστότερη επιλογή. |+| **Χρήση** | Εάν διαφορετικές υλοποιήσεις κλάσεων χρησιμοποιούν τις ίδιες μεθόδους για την διεπαφή τους με άλλες κλάσεις τότε ένα interface θεωρείται κατάλληλο για να δηλώσει τα κοινά τους χαρακτηριστικά. ​ | Εάν διαφορετικές υλοποιήσεις κλάσεων έχουν κοινά χαρακτηριστικά που αφορούν την εσωτερική τους κατάσταση (π.χ. κοινές μεταβλητές) τότε η χρήση μίας abstract κλάσης ως κοινός πρόγονος είναι η σωστότερη επιλογή. |
 | **Ταχύτητα** | Λιγότερο ταχύ | Ταχύτερο |  | **Ταχύτητα** | Λιγότερο ταχύ | Ταχύτερο | 
 +| **Επεκτασιμότητα** | Θεωρείται κακή προγραμματιστική πρακτική η επέκταση ενός Interface. Ένα Interface δεν θα πρέπει να σχεδιάζεται με γνώμονα την μελλοντική του επέκταση. | Μία abstract κλάση μπορεί να αλλάξει την υλοποίηση της και να επεκταθεί,​ αρκεί να περιέχει default υλοποιήσεις για τις νέες μεθόδους που ορίζει. |
 +
 +
 +|Προηγούμενο:​ [[ :​java:​abstract_classes | Abstract Κλάσεις ]] | [[ :toc | Περιεχόμενα ]] | Επόμενο:​ [[ :​java:​instanceof| Τελεστής instanceof ]]|
  
java/abstract_classes_vs_interfaces.1425280531.txt.gz · Last modified: 2016/02/26 11:15 (external edit)