Συνιστάται, 2024

Επιλογή Συντάκτη

Διαφορά μεταξύ διεπαφής και αφηρημένης κλάσης σε Java & C #

Η διεπαφή και η αφηρημένη τάξη συμβάλλουν στην "ατελή τύχη" του OOP. Μερικές φορές χρειαζόμαστε μια υπερκλάση για να ορίσουμε "τι να κάνουμε" αλλά όχι "πώς να το κάνουμε", είναι πώς να κάνει μέρος θα εφαρμοστεί από την παράγωγη τάξη ανάλογα με τις ανάγκες της, " διεπαφή " παρέχει μια λύση σε αυτό. Μερικές φορές χρειαζόμαστε μια κλάση superclass που ορίζει κάποια γενικευμένη δομή που μπορεί να εφαρμοστεί από παράγωγες κλάσεις και κάποια συγκεκριμένη δομή που μπορεί να χρησιμοποιηθεί από τις παράγωγες κλάσεις, η " αφηρημένη κλάση " παρέχει μια λύση σε αυτό. Η θεμελιώδης διαφορά μεταξύ διεπαφής και αφηρημένης κλάσης είναι ότι η διεπαφή είναι πλήρως ατελής και η αφηρημένη τάξη είναι μερικώς ατελής.

Συγκριτικό διάγραμμα

Βάση σύγκρισηςΔιεπαφήΑφηρημένη κατηγορία
ΒασικόςΌταν γνωρίζετε μόνο τις απαιτήσεις και όχι την εφαρμογή του, χρησιμοποιείτε το "Interface".Όταν ξέρετε εν μέρει για τις υλοποιήσεις που χρησιμοποιείτε "Αφηρημένες κατηγορίες".
ΜέθοδοιΗ διασύνδεση περιέχει μόνο αφηρημένες μεθόδους.Η αφηρημένη τάξη περιέχει αφηρημένες μεθόδους καθώς και συγκεκριμένες μεθόδους.
Τροποποιητής πρόσβασης των μεθόδωνΟι μέθοδοι διεπαφής είναι πάντα "Δημόσιες" και "Αφηρημένες", ακόμη και αν δεν δηλώνουμε. Ως εκ τούτου, μπορεί να ειπωθεί ως 100%, καθαρή αφηρημένη κατηγορία.Δεν είναι υποχρεωτική η μέθοδος σε αφηρημένη κατηγορία να είναι δημόσια και αφηρημένη. Μπορεί επίσης να έχει συγκεκριμένες μεθόδους.
Περιορισμένος τροποποιητής για μεθόδουςΜια μέθοδος διεπαφής δεν μπορεί να δηλωθεί με τους ακόλουθους τροποποιητές:
Δημόσιο: Ιδιωτικό και προστατευμένο
Περίληψη: τελική, στατική, συγχρονισμένη, μητρική, strictfp.
Δεν υπάρχουν περιορισμοί στους τροποποιητές της μεταβλητής αφηρημένης κλάσης.
Τροποποιητής πρόσβασης μεταβλητώνΗ επιτρεπόμενη τροποποιητής επιτρέπεται για μεταβλητές διεπαφής είναι δημόσιες, στατικές και τελικές είτε δηλώνουμε είτε όχι.Οι μεταβλητές στην αφηρημένη κατηγορία δεν χρειάζεται να είναι δημόσιες, στατικές, τελικές.
Περιορισμένοι τροποποιητές για μεταβλητέςΟι μεταβλητές διασύνδεσης δεν μπορούν να δηλωθούν ως ιδιωτικές, προστατευμένες, παροδικές, μεταβλητές.Δεν υπάρχουν περιορισμοί στους τροποποιητές των αφηρημένων μεταβλητών κλάσης.
Αρχικοποίηση μεταβλητώνΟι μεταβλητές διεπαφής πρέπει να αρχικοποιούνται κατά τη στιγμή της δήλωσης.Δεν είναι υποχρεωτικό οι αφηρημένες μεταβλητές κλάσης να αρχικοποιούνται κατά τη στιγμή της δήλωσής τους.
Παράσταση και στατικά μπλοκΣτην εσωτερική διεπαφή, δεν μπορείτε να δηλώσετε μια παρουσία ή ένα στατικό μπλοκ.Η αφηρημένη κλάση επιτρέπει σε ένα στιγμιότυπο ή στατικό μπλοκ μέσα σε αυτήν.
ΚατασκευαστέςΔεν μπορείτε να δηλώσετε τον κατασκευαστή στη διεπαφή.Μπορείτε να δηλώσετε τον κατασκευαστή μέσα σε μια αφηρημένη κλάση.

Ορισμός της διασύνδεσης

Η Java δεν επιτρέπει πολλαπλή κληρονομικότητα. Δηλαδή, μια μόνη τάξη δεν μπορεί να κληρονομήσει περισσότερες από μία τάξεις τη φορά. Ο λόγος πίσω από αυτό μπορεί να εξηγηθεί με ένα παράδειγμα. Ας υποθέσουμε ότι έχουμε δύο γονικές τάξεις, Α και Β και μια παράγωγη κλάση C. Η κλάση C που κληρονομείται τόσο από τις κλάσεις Α και Β. Τώρα, και οι δύο έχουν την τάξη Α και Β έχουν σύνολο μεθόδων (), τότε θα είναι μια ερώτηση για την κλάση C, ποια μέθοδος set () της κλάσης πρέπει να κληρονομήσει. Η λύση αυτού του προβλήματος είναι η "διεπαφή".

Η διασύνδεση είναι μια καθαρά αφηρημένη τάξη. Η λέξη-κλειδί που χρησιμοποιήθηκε για τη δημιουργία διεπαφής είναι "διεπαφή". Καθώς όλη η μέθοδος μέσα στο interface είναι πλήρως αφηρημένη. Η διασύνδεση καθορίζει μόνο τι πρέπει να κάνει μια κλάση, αλλά δεν καθορίζει πώς το κάνει. Ακριβώς επειδή όλη η μέθοδος που δηλώνεται μέσα στη διεπαφή είναι αφηρημένη, δεν δημιουργείται παράσταση για μια διεπαφή. Η γενική μορφή του "interface" στη java είναι:

 access_specifier διεπαφή interface_name {return-type method-name1 (λίστα παραμέτρων); μέθοδος επιστροφής τύπου-όνομα2 (λίστα παραμέτρων). type final-varname1 = τιμή; type final-varname2 = τιμή; // ... return-type method-nameN (λίστα παραμέτρων); type final-varnameN = τιμή; }} 

Ο προσδιοριστής πρόσβασης δηλώνεται δημόσια, επειδή οι κλάσεις πρέπει να εφαρμόσουν τη διασύνδεση.

Δεν έχουμε την έννοια της "Διεπαφής" στην C ++. Αλλά, η Java και η C # ορίζουν πολύ καλά τη διεπαφή.

Διεπαφή σε Java:

  • Οι μεταβλητές μιας διεπαφής είναι από προεπιλογή πάντα δημόσιες, στατικές και τελικές.
  • Οι μεταβλητές πρέπει να αρχικοποιούνται κατά τη στιγμή της δήλωσής τους.
  • Οι μεταβλητές δεν μπορούν ποτέ να δηλωθούν ως ιδιωτικές, προστατευμένες, μεταβατικές και μεταβλητές.
  • Οι μέθοδοι διεπαφής είναι πάντα δημόσιες και αφηρημένες, ενώ δεν μπορούν ποτέ να δηλωθούν ως ιδιωτικές, προστατευμένες, τελικές, στατικές, συγχρονισμένες, φυσικές και αυστηρές.
  • Δεν μπορείτε να δηλώσετε οποιονδήποτε κατασκευαστή μέσα στην διεπαφή, καθώς ο κύριος σκοπός του κατασκευαστή είναι η αρχικοποίηση των μεταβλητών κλάσης, αλλά στις μεταβλητές διεπαφής αρχικοποιούνται κατά τη στιγμή της δήλωσής του.
  • Η διασύνδεση μπορεί να κληρονομήσει άλλες διεπαφές, αλλά η τάξη που εφαρμόζει αυτή τη διασύνδεση πρέπει να εφαρμόσει τις μεθόδους όλων των κληρονομούμενων διεπαφών.
  • Μια κλάση μπορεί να κληρονομήσει περισσότερες από μία διεπαφές κάθε φορά και πρέπει να εφαρμόσει όλες τις μεθόδους όλων των κληρονομημένων διεπαφών.

Η γενική μορφή υλοποίησης διεπαφής Java:

 class class_name υλοποιεί Interface_name {// class-body} 

Για την κληρονομική διασύνδεση, μια κλάση χρησιμοποιεί μια λέξη-κλειδί "υλοποιεί" και η κλάση εφαρμόζει όλη τη μέθοδο που δηλώνεται από μια κληρονομική διεπαφή.

Διασύνδεση σε C #:

Η διασύνδεση στο C # είναι σχεδόν παρόμοια με τη διεπαφή της Java εκτός από:

  • Η διασύνδεση στο C # δεν δηλώνει τις μεταβλητές.
  • Το όνομα της διασύνδεσης έχει πρόθεμα με κεφαλαία I και κληρονομείται με ένα τελεία (:).

Η γενική μορφή υλοποίησης διεπαφής στο C #:

 class class_name: όνομα_διαμεσολάβησης {// class-body} 

Ορισμός της αφηρημένης κλάσης

Μια τάξη που περιέχει μία ή περισσότερες αφηρημένες μεθόδους ονομάζεται αφηρημένη κλάση και μια τάξη δηλώνεται ως αφηρημένη με τη λέξη "αφηρημένη", στην οποία προηγείται η λέξη-κλειδί "κλάσης" στην αρχή της δήλωσης κλάσης. Δεδομένου ότι η αφηρημένη κλάση περιέχει την αφηρημένη μέθοδο, συνιστά έναν ατελές τύπο. Επομένως, δεν μπορείτε να δημιουργήσετε αντικείμενα αφηρημένης κλάσης. Κάθε φορά που μια τάξη κληρονομεί μια αφηρημένη τάξη, πρέπει να εφαρμόσει όλες τις αφηρημένες μεθόδους της αφηρημένης τάξης, αν δεν πρέπει τότε να δηλωθεί ως αφηρημένη. Η αφηρημένη ιδιότητα κληρονομείται μέχρι να επιτευχθεί η πλήρης εφαρμογή των αφηρημένων μεθόδων.

Η αφηρημένη κλάση μπορεί επίσης να περιέχει συγκεκριμένες μεθόδους που μπορούν να αξιοποιηθούν από την κλάση που προέρχεται όπως είναι. Αλλά, δεν μπορείτε να δηλώσετε έναν αφηρημένο κατασκευαστή ή μια αφηρημένη στατική μέθοδο μέσα σε μια αφηρημένη κλάση. Η γενική μορφή της αφηρημένης κλάσης στην Java είναι η εξής:

 αφηρημένη κλάση class_name {abstract method_name1 (); αφηρημένη μέθοδος_εφαρμογής2 (); : return_type method_name3 (parameter_list) {// συγκεκριμένη μέθοδος} return_type method_name4 (parameter_list) {// concrete method}}; 

Η έννοια μιας αφηρημένης κλάσης είναι παρόμοια τόσο στην Java όσο και στην C #. Μια αφηρημένη κλάση είναι ελαφρώς διαφορετική σε C ++.

Στην C ++ αν μια τάξη έχει τουλάχιστον μία εικονική συνάρτηση, η τάξη γίνεται μια αφηρημένη κλάση. Αντί της λέξης "αφηρημένη", η λέξη "εικονική" χρησιμοποιείται για να δηλώσει μια αφηρημένη μέθοδο.

Βασικές διαφορές μεταξύ της διασύνδεσης και της αφηρημένης τάξης στην Java & C #

  1. Όταν έχετε τη γνώση του "τι απαιτείται", αλλά όχι του "πώς θα εφαρμοζόταν" τότε πρέπει να χρησιμοποιηθεί διεπαφή. Από την άλλη πλευρά, αν γνωρίζετε τι απαιτείται και εν μέρει γνωρίζετε πώς θα εφαρμοστεί, χρησιμοποιήστε μια αφηρημένη κλάση.
  2. Μια διεπαφή έχει όλες τις μεθόδους της αφηρημένη, αλλά μια αφηρημένη τάξη έχει μερικές αφηρημένες μεθόδους και μερικές συγκεκριμένες μεθόδους.
  3. Οι μέθοδοι μέσα σε μια διεπαφή είναι δημόσιες και αφηρημένες ως εκ τούτου, ονομάζεται επίσης ως καθαρή αφηρημένη τάξη. Από την άλλη πλευρά, οι μέθοδοι μέσα σε μια περίληψη δεν περιορίζονται μόνο στο να είναι δημόσιες και αφηρημένες.
  4. Μια μέθοδος διεπαφής δεν μπορεί ποτέ να είναι ιδιωτική, προστατευμένη, τελική, στατική, συγχρονισμένη, μητρική ή strictfp. Από την άλλη πλευρά, δεν υπάρχουν περιορισμοί στις μεθόδους μιας αφηρημένης τάξης.
  5. Οι μεταβλητές σε μια διεπαφή είναι δημόσιες και τελικές είτε αυτές δηλώνουμε είτε όχι, ενώ δεν υπάρχει τέτοιος περιορισμός στις μεταβλητές μιας αφηρημένης κλάσης να είναι δημόσιος και τελικός μόνο.
  6. Οι μεταβλητές σε μια διεπαφή δεν μπορούν ποτέ να είναι ιδιωτικά προστατευμένες μεταβατικές ή πτητικές, ενώ δεν υπάρχει περιορισμός σε μεταβλητές σε μια αφηρημένη κλάση.
  7. Η μεταβλητή μιας διεπαφής πρέπει να αρχικοποιηθεί κατά τη διάρκεια της δήλωσης. Από την άλλη πλευρά, οι μεταβλητές σε μια αφηρημένη κλάση μπορούν να αρχικοποιηθούν ανά πάσα στιγμή.
  8. Μέσα σε μια διεπαφή, δεν μπορεί να δηλωθεί ένα στιγμιότυπο ή ένα στατικό μπλοκ, αλλά μπορείτε να δηλώσετε ένα στιγμιότυπο ή ένα στατικό μπλοκ μέσα σε μια αφηρημένη κλάση.
  9. Δεν μπορείτε να ορίσετε τον κατασκευαστή μέσα σε μια διεπαφή, ενώ μπορείτε να ορίσετε τον κατασκευαστή μέσα σε μια αφηρημένη κλάση.

Συμπέρασμα:

Όταν χρειάζεται να δημιουργήσετε μια τάξη βάσης που περιέχει μια γενικευμένη μορφή μεθόδων που μπορούν να εφαρμοστούν από τις παράγωγες κλάσεις ανάλογα με την ανάγκη τους, η έννοια της διασύνδεσης και της αφηρημένης κλάσης βοηθάει στην επίτευξη αυτού του στόχου.

Top