Διαδρομές
/
C#
C#
/
Ύλη
/
Υπερφόρτωση τελεστών
Υπ

Υπερφόρτωση τελεστών σε C#

2 ασκήσεις

Σχετικά με την έννοια Υπερφόρτωση τελεστών

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

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

Οι περισσότεροι τελεστές έχουν τη μορφή:

static <return type> operaator <operator symbols>(<parameters>);

Οι τελεστές μετατροπής έχουν τη μορφή:

static (explicit|implicit) operator <cast-to-type>(<cast-from-type> <parameter name>);

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

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

Παραδείγματα σύνταξης:

struct Point
{
    decimal x;
    decimal y;

    public static bool operator ==(Point pt, Point ptOther)
    {
        return pt.x == ptOther.x && pt.y == ptOther.y;
    }

    public static bool operator !=(Point pt, Point ptOther)
    {
        return !(pt == ptOther);
    }

    public static Point operator *(Point pt, decimal scale)
    {
        var ptNew = new Point();
        ptNew.x = pt.x * scale;
        ptNew.y = pt.y * scale;
        return ptNew;
    }

    public static implicit operator Point((decimal x, decimal y) xy)
    {
        var pt = new Point();
        pt.x = xy.x;
        pt.y = xy.y;
        return pt;
    }

    public static explicit operator (decimal x, decimal y)(Point pt)
    {
        return (pt.x, pt.y);
    }
}

Συχνά είναι αποδοτικό να υλοποιήσεις μια μέθοδο Equals() και να την καλέσεις από τον τελεστή ==. Παρομοίως, για τις συγκρίσεις μπορείς να υλοποιήσεις τη διεπαφή IComparable. Και στις δύο περιπτώσεις, σκοτώνεις δύο πουλιά με ένα σμπάρο και κάτι παραπάνω.

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

Σημείωσε ότι η σειρά των παραμέτρων έχει σημασία όταν αυτές διαφέρουν ως προς τον τύπο. Στον παραπάνω κώδικα, το pt * 10m είναι νόμιμη έκφραση, ενώ το 10m * pt δεν μεταγλωττίζεται.

Παραπομπές

Αυτή η τεκμηρίωση για την υπερφόρτωση τελεστών περιγράφει αναλυτικά τη σύνταξη.

Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Υπερφόρτωση τελεστών

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 1 ακόμη άσκηση για να εξασκηθείς στην έννοια Υπερφόρτωση τελεστών