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

Εξερεύνηση εικονικών και αφηρημένων μεθόδων στο C #

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

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

Το MSDN δηλώνει: "Η εικονική λέξη-κλειδί χρησιμοποιείται για την τροποποίηση μιας μεθόδου, μιας ιδιότητας, ενός ευρετηρίου ή μιας δήλωσης συμβάντος και επιτρέπει την αντικατάστασή της σε μια παράγωγη κλάση."

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

δημόσια τάξη Βάση

{

δημόσια δοκιμή εικονικού κενού ()

{

Console.WriteLine ("Αυτή είναι η βασική έκδοση της εικονικής μεθόδου");

}

}

δημόσια τάξη που προέρχεται: Βάση

{

δημόσια παράκαμψη δοκιμής κενού ()

{

Console.WriteLine ("Αυτή είναι η παραγόμενη έκδοση της εικονικής μεθόδου");

}

}

Η μέθοδος Test () δηλώνεται ως εικονική στην κλάση Base και παρακάμπτεται στην κλάση Derived. Σημειώστε πώς χρησιμοποιείται η εικονική λέξη-κλειδί για να δηλώσετε τη μέθοδο ως εικονική στην κλάση Βάσης. Η εικονική λέξη-κλειδί δεν απαιτείται όταν παρακάμπτετε την εικονική μέθοδο στην κατηγορία Derived.

Τώρα, ανατρέξτε στο απόσπασμα κώδικα που δίνεται στη συνέχεια που δείχνει τον τρόπο με τον οποίο καλούνται οι εικονικές μέθοδοι.

Πρόγραμμα τάξης

{

στατικό κενό Κεντρικό ()

{

Base baseObj1 = νέα βάση ();

baseObj1.Test ();

Base baseObj2 = νέο παράγωγο ();

baseObj2.Test ();

}

}

Σημειώστε ότι δημιουργούνται δύο παρουσίες της κατηγορίας Base - baseObj1 και baseObj2. Στην πρώτη περίπτωση, το αντικείμενο αναφοράς που ονομάζεται baseObj1 αναφέρεται σε μια παρουσία της κλάσης Base. Στη δεύτερη περίπτωση, το αντικείμενο αναφοράς που ονομάζεται baseObj2 αναφέρεται σε μια παρουσία της κλάσης του Derived. Όταν εκτελείτε τον κώδικα, η πρώτη κλήση στην εικονική μέθοδο θα εμφανίζει το μήνυμα "Αυτή είναι η βασική έκδοση της εικονικής μεθόδου" στην κονσόλα. Στη δεύτερη περίπτωση, θα εμφανιστεί το μήνυμα "Αυτή είναι η παραγόμενη έκδοση της εικονικής μεθόδου". Γιατί αυτή η διαφορά;

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

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

Μια τυπική χρήση μιας αφηρημένης μεθόδου είναι να εξαναγκαστεί η παράκαμψη των μεθόδων ToString () ή Equals (). Το παρακάτω απόσπασμα κώδικα απεικονίζει τον τρόπο με τον οποίο οι αφηρημένες μέθοδοι δηλώνονται σε μια αφηρημένη τάξη με το όνομα EntityBase.

δημόσια αφηρημένη τάξη EntityBase

{

δημόσια περίληψη παράκαμψης συμβολοσειράς ToString ();

δημόσια αφηρημένη παράκαμψη bool Equals (αντικείμενο obj);

}

Πελάτης δημόσιας τάξης: EntityBase

{

// Κωδικός εφαρμογής για τις αφηρημένες μεθόδους

}

Η κλάση EntityBase είναι ο βασικός τύπος για όλες τις οντότητες - η κλάση οντοτήτων πελατών επεκτείνει αυτήν την κλάση και παρέχει εφαρμογή για τις αφηρημένες μεθόδους. Στην ουσία, όλες οι κατηγορίες οντοτήτων θα παρέχουν τη δική τους εφαρμογή των μεθόδων ToString () και Equals (). Δεν απαιτείται προεπιλεγμένη εφαρμογή για αυτές τις μεθόδους στη βασική κλάση και ως εκ τούτου επισημαίνονται ως αφηρημένες. Έτσι, η παράκαμψη μεθόδου επιβάλλεται δηλώνοντας τη μέθοδο ως αφηρημένη στην βασική κλάση που ονομάζεται EntityBase.