Προγραμματισμός

Πότε να χρησιμοποιήσετε μια αφηρημένη τάξη έναντι διεπαφής στο C #

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

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

Εξήγησε η C # abstract τάξη

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

Εξήγησε η διεπαφή C #

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

Πρέπει να χρησιμοποιήσω μια αφηρημένη τάξη ή μια διεπαφή;

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

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

Όπως αναφέρει η τεκμηρίωση των διεπαφών της Microsoft:

Χρησιμοποιώντας διεπαφές, μπορείτε, για παράδειγμα, να συμπεριλάβετε συμπεριφορά από πολλές πηγές σε μια τάξη. Αυτή η ικανότητα είναι σημαντική στο C #, επειδή η γλώσσα δεν υποστηρίζει πολλαπλές κληρονομικές τάξεις. Επιπλέον, πρέπει να χρησιμοποιήσετε μια διεπαφή εάν θέλετε να προσομοιώσετε την κληρονομιά για δομές, επειδή δεν μπορούν να κληρονομήσουν από άλλη δομή ή κλάση.

Έμμεσες και ρητές εφαρμογές διεπαφής

Οι διεπαφές μπορούν να εφαρμοστούν έμμεσα ή ρητά. Επιτρέψτε μου να εξηγήσω πώς διαφέρουν αυτές οι δύο εφαρμογές. Σκεφτείτε μια διεπαφή που ονομάζεται IBusinessLogic.

δημόσια διεπαφή IBusinessLogic

{

άκυρο Αρχικοποίηση ();

}

Η ακόλουθη τάξη ονομάστηκε Επαγγελματική λογική εφαρμόζει το IBusinessLogic διεπαφή.

δημόσια τάξη BusinessLogic: IBusinessLogic

{

δημόσιο κενό Εκκίνηση ()

   {

// Κάποιος κωδικός

   }

}

Μπορείτε να δημιουργήσετε μια παρουσία του Επαγγελματική λογική τάξη ρητά και στη συνέχεια καλέστε το Αρχικοποίηση () μέθοδο όπως φαίνεται παρακάτω.

 IBusinessLogic businessLogic = νέο BusinessLogic ();

businessLogic.Initialize ();

Το παρακάτω απόσπασμα κώδικα δείχνει πώς μπορείτε να εφαρμόσετε το IBusinessLogic διεπαφή σιωπηρά.

δημόσια τάξη BusinessLogic: IBusinessLogic

{

άκυρο IBusinessLogic.Initialize ()

   {

   }

}

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

 BusinessLogic businessLogic = νέο BusinessLogic ();

businessLogic.Initialize ();

Πώς να κάνετε περισσότερα στο C #:

  • Πότε να χρησιμοποιήσετε μια αφηρημένη τάξη εναντίον διεπαφής στο C #
  • Πώς να εργαστείτε με το AutoMapper στο C #
  • Πώς να χρησιμοποιήσετε τις εκφράσεις λάμδα στο C #
  • Πώς να συνεργαστείτε με τους αντιπροσώπους Action, Func και Predicate στο C #
  • Πώς να συνεργαστείτε με εκπροσώπους στο C #
  • Πώς να εφαρμόσετε έναν απλό καταγραφέα στο C #
  • Πώς να εργαστείτε με χαρακτηριστικά στο C #
  • Πώς να εργαστείτε με το log4net στο C #
  • Πώς να εφαρμόσετε το μοτίβο σχεδίασης αποθετηρίου στο C #
  • Πώς να εργαστείτε με προβληματισμό στο C #
  • Πώς να εργαστείτε με το σύστημα παρακολούθησης αρχείων στο C #
  • Πώς να εκτελέσετε τεμπέλης αρχικοποίηση στο C #
  • Πώς να εργαστείτε με το MSMQ στο C #
  • Πώς να εργαστείτε με μεθόδους επέκτασης στο C #
  • Πώς να μας εκφράσεις λάμδα στο C #
  • Πότε να χρησιμοποιήσετε την ευμετάβλητη λέξη-κλειδί στο C #
  • Πώς να χρησιμοποιήσετε τη λέξη-κλειδί απόδοσης στο C #
  • Πώς να εφαρμόσετε τον πολυμορφισμό στο C #
  • Πώς να δημιουργήσετε τον δικό σας προγραμματιστή εργασιών στο C #
  • Πώς να εργαστείτε με το RabbitMQ στο C #
  • Πώς να εργαστείτε με μια πλειάδα στο C #
  • Εξερεύνηση εικονικών και αφηρημένων μεθόδων στο C #
$config[zx-auto] not found$config[zx-overlay] not found