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

Πώς να εφαρμόσετε τον πολυμορφισμό στο C #

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

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

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

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

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

Παραμετρικός πολυμορφισμός

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

Η ακόλουθη λίστα κωδικών δείχνει πώς μπορεί να εφαρμοστεί η μέθοδος υπερφόρτωσης.

public enum σοβαρότητα

    {

Ενημερωτική, προειδοποίηση, κρίσιμη

    }

δημόσιος κλάσης καταγραφέας

    {

δημόσιο άκυρο αρχείο καταγραφής (μήνυμα συμβολοσειράς)

        {

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

        }

δημόσιο άκυρο αρχείο καταγραφής (μήνυμα συμβολοσειράς, σοβαρότητα σοβαρότητας)

        {

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

        }

    }

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

Πολυμορφισμός ένταξης

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

Το παρακάτω απόσπασμα κώδικα εμφανίζει δύο κλάσεις - την βασική κλάση με το όνομα Logger που περιέχει μια εικονική μέθοδο που ονομάζεται Log και μια παράγωγη κλάση με το όνομα FileLogger που επεκτείνει την κλάση Logger και παρακάμπτει τη μέθοδο Log της βασικής κλάσης.

δημόσιος κλάσης καταγραφέας

    {

δημόσιο εικονικό κενό κενό (μήνυμα συμβολοσειράς)

        {

Console.WriteLine ("Μέσα στη μέθοδο καταγραφής του Logger κατηγορίας βάσης");

        }

    }

δημόσια τάξη FileLogger: Logger

    {

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

        {

Console.WriteLine ("Μέσα στη μέθοδο καταγραφής της κλάσης FileLogger");

        }

    }

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

static void Main (συμβολοσειρά [] args)

        {

Logger logger = νέο FileLogger ();

logger.Log ("Γεια σου Κόσμος!");

Κονσόλα.ReadKey ();

        }

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

$config[zx-auto] not found$config[zx-overlay] not found