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

Πώς να εργαστείτε με υπερφόρτωση χειριστή στο C #

Ο πολυμορφισμός είναι μία από τις βασικές αρχές του OOP (Object Oriented Programming). Η λέξη Πολυμορφισμός προέρχεται από δύο λέξεις - «πολυ» που σημαίνει πολλές και «μορφές» που σημαίνει μορφές. Ως εκ τούτου, ο πολυμορφισμός συνεπάγεται την ύπαρξη του ίδιου πράγματος αλλά σε διαφορετικές μορφές.

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

Ποιοι είναι οι χειριστές και ποιοι είναι οι χειριστές που μπορούν να υπερφορτωθούν;

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

Χ + Υ

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

Οι unary τελεστές, δηλαδή, οι τελεστές που λειτουργούν με έναν τελεστή μπορεί να είναι υπερφορτωμένοι. Μπορείτε επίσης να υπερφορτώσετε δυαδικούς τελεστές και τελεστές σύγκρισης όπως, ==,! =,, =. Ωστόσο, δεν μπορείτε να υπερφορτώσετε τους τελεστές =,?, ->, new, is, sizeof ή typeof. Δεν μπορείτε επίσης να υπερφορτώσετε τους τελεστές υπό όρους όπως && και || εύκολα. Επίσης, ο χειριστής ευρετηρίου συστοιχιών [] δεν μπορεί να υπερφορτωθεί.

Μπορείτε να μάθετε περισσότερα σχετικά με το τι μπορούν να υπερφορτωθούν όλοι οι χειριστές από αυτό το άρθρο MSDN.

Υπερφόρτωση φορέα εκμετάλλευσης σε C #

Σε αυτήν την ενότητα θα διερευνήσουμε πώς μπορούμε να εφαρμόσουμε υπερφόρτωση χειριστή στο C #. Εξετάστε την ακόλουθη τάξη που ονομάζεται DistanceCalculator.

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

   {

Int32 πόδια = 0, ίντσα = 0;

δημόσιο DistanceCalculator (Int32 πόδια = 0, Int32 ίντσα = 0)

       {

this.feet = πόδια;

this.inch = ίντσα;

       }

   }

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

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

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

δημόσιος στατικός τελεστής bool == (DistanceCalculator obj1, DistanceCalculator obj2)

       {

επιστροφή obj1.Value == obj2.Value;

       }

δημόσιος στατικός τελεστής bool! = (DistanceCalculator obj1, DistanceCalculator obj2)

       {

επιστροφή obj1.Value! = obj2.Value;

       }

Σημειώστε ότι η τιμή είναι μια ιδιότητα που επιστρέφει την τιμή σε ίντσες.

δημόσια τιμή Int32

       {

παίρνω

           {

επιστροφή (πόδια * 12) + ίντσα

           }

       }

Ακολουθεί η πλήρης λίστα κωδικών της κλάσης DistanceCalculator.

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

   {

Int32 πόδια = 0, ίντσα = 0;

δημόσιο DistanceCalculator (Int32 πόδια = 0, Int32 ίντσα = 0)

       {

this.feet = πόδια;

this.inch = ίντσα;

       }

δημόσιος στατικός τελεστής bool == (DistanceCalculator obj1, DistanceCalculator obj2)

       {

επιστροφή obj1.Value == obj2.Value;

       }

δημόσιος στατικός τελεστής bool! = (DistanceCalculator obj1, DistanceCalculator obj2)

       {

επιστροφή obj1.Value! = obj2.Value;

       }

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

       {

DistanceCalculator distanceCalculator = obj ως DistanceCalculator;

εάν (απόσταση Υπολογιστής! = null)

           {

επιστροφή (απόστασηCalculator == αυτό);

           }

επιστροφή ψευδής?

       }

δημόσια παράκαμψη int GetHashCode ()

       {

επιστροφή Value.GetHashCode ();

       }

δημόσια πόδια Int32

       {

πάρτε {επιστροφή πόδια; }

       }

δημόσια Int32 ίντσες

       {

λάβετε {return inch? }

       }

δημόσια τιμή Int32

       {

παίρνω

           {

επιστροφή (πόδια * 12) + ίντσα

           }

       }

   }

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

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

       {

DistanceCalculator obj1 = νέο DistanceCalculator (1, 2);

DistanceCalculator obj2 = νέο DistanceCalculator (1, 2);

Console.WriteLine ((obj1 == obj2). ToString ());

Κονσόλα. Διαβάστε ();

       }

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

δημόσιος στατικός τελεστής DistanceCalculator + (DistanceCalculator obj1, DistanceCalculator obj2)

       {

Int32 totalInches = obj1.Value + obj2.Value;

Int32 πόδια = totalInches / 12;

Int32 ίντσα = totalInches% 12;

DistanceCalculator temp = νέο DistanceCalculator (πόδια, ίντσα);

θερμοκρασία επιστροφής;

       }

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

δημόσια πόδια Int32

       {

πάρτε {επιστροφή πόδια; }

       }

δημόσια Int32 ίντσες

       {

λάβετε {return inch? }

       }

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

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

       {

DistanceCalculator obj1 = νέο DistanceCalculator (1, 11);

DistanceCalculator obj2 = νέο DistanceCalculator (1, 2);

DistanceCalculator obj3 = obj1 + obj2;

Console.WriteLine ("Feet:" + obj3.Feet.ToString ());

Console.WriteLine ("Inch:" + obj3.Inch.ToString ());

Κονσόλα. Διαβάστε ();

       }