So arbeiten Sie mit der Überladung von Operatoren in C #

Polymorphismus ist eines der Grundprinzipien von OOP (Object Oriented Programming). Das Wort Polymorphismus leitet sich von zwei Wörtern ab - "poly" bedeutet viele und "morph" bedeutet Formen. Polymorphismus impliziert daher die Existenz derselben Sache, jedoch in unterschiedlichen Formen.

Die Operatorüberladung ist ein Beispiel für statischen Polymorphismus. Sie können die Überladung von Operatoren nutzen oder Operatoren Funktionen hinzufügen, um mit benutzerdefinierten Typen zu arbeiten, ähnlich wie Sie mit grundlegenden Datentypen arbeiten.

Was sind die Operatoren und welche Operatoren können überlastet werden?

In einem Ausdruck haben Sie normalerweise Operatoren und Operanden. Operatoren sind solche, die an Operanden arbeiten und alle Teil eines Ausdrucks sind. Das folgende Beispiel enthält beispielsweise zwei Operanden und einen Operator. Die Operanden sind X und Y und der Operator ist +.

X + Y.

Operatoren werden abhängig von ihrem Zweck und der Anzahl der Operanden, an denen die Operatoren arbeiten würden, als unär, binär, Vergleich, Zuweisung usw. klassifiziert. Obwohl die meisten Bediener überlastet werden können, gelten bestimmte Einschränkungen. Im Wesentlichen können nicht alle Bediener überlastet werden.

Die unären Operatoren, dh Operatoren, die mit einem Operanden arbeiten, können überladen werden. Sie können auch Binäroperatoren und Vergleichsoperatoren wie == ,! = ,, = Überladen. Sie können jedoch die Operatoren =,?, ->, new, is, sizeof oder typeof nicht überladen. Sie können auch die bedingten Operatoren wie && und || nicht überladen leicht. Außerdem kann der Array-Indizierungsoperator [] nicht überladen werden.

In diesem MSDN-Artikel erfahren Sie mehr darüber, was alle Operatoren überladen können.

Implementieren der Operatorüberladung in C #

In diesem Abschnitt werden wir untersuchen, wie wir das Überladen von Operatoren in C # implementieren können. Betrachten Sie die folgende Klasse mit dem Namen DistanceCalculator.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

       public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)

       {

           this.feet = feet;

           this.inch = inch;

       }

   }

Siehe die obige Codeliste. Die DistanceCalculator-Klasse enthält zwei Datenelemente vom Typ Int32, nämlich Fuß und Zoll. Wir würden dieser Klasse nun weitere Methoden hinzufügen, um zu veranschaulichen, wie Operatoren überladen werden können.

Wenn Sie mit Überlastung des Bedieners arbeiten, müssen Sie bestimmte Punkte berücksichtigen. Der zu überladende Operator sollte über eine entsprechende Methode verfügen, die mit dem Schlüsselwortoperator gekennzeichnet ist. Die Argumente für die Operatorfunktion sind Operanden, und Ihre Operatorfunktion kann einen Wert zurückgeben. Die Operatorfunktion sollte statisch sein und ein Mitglied des enthaltenen Typs sein.

Das folgende Codeausschnitt zeigt, wie eine typische Operatorfunktion aussehen würde. Dieses Beispiel zeigt, wie die Operatoren == und! = Überladen werden können.

public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value == obj2.Value;

       }

       public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value != obj2.Value;

       }

Beachten Sie, dass Value eine Eigenschaft ist, die den Wert in Zoll zurückgibt.

public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

Hier ist die vollständige Codeliste der DistanceCalculator-Klasse.

public class DistanceCalculator

   {

       Int32 feet = 0, inch = 0;

       public DistanceCalculator(Int32 feet = 0, Int32 inch = 0)

       {

           this.feet = feet;

           this.inch = inch;

       }

       public static bool operator ==(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value == obj2.Value;

       }

       public static bool operator !=(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           return obj1.Value != obj2.Value;

       }

       public override bool Equals(object obj)

       {

           DistanceCalculator distanceCalculator = obj as DistanceCalculator;

           if (distanceCalculator != null)

           {

               return (distanceCalculator == this);

           }

           return false;

       }

       public override int GetHashCode()

       {

           return Value.GetHashCode();

       }

     public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

       public Int32 Value

       {

           get

           {

               return (feet * 12) + inch;

           }

       }

   }

Das folgende Codeausschnitt zeigt, wie Sie die DistanceCalculator-Klasse verwenden können.

static void Main(string[] args)

       {

           DistanceCalculator obj1 = new DistanceCalculator(1, 2);

           DistanceCalculator obj2 = new DistanceCalculator(1, 2);

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

           Console.Read();

       }

Das folgende Codeausschnitt zeigt, wie Sie den Operator + überladen können, um zwei Objekte hinzuzufügen.

public static DistanceCalculator operator +(DistanceCalculator obj1, DistanceCalculator obj2)

       {

           Int32 totalInches = obj1.Value + obj2.Value;

           Int32 feet = totalInches / 12;

           Int32 inch = totalInches % 12;

           DistanceCalculator temp = new DistanceCalculator(feet, inch);

           return temp;

       }

Fügen wir der DistanceCalculator-Klasse die folgenden zwei Eigenschaften hinzu. Das folgende Codefragment zeigt, wie Sie zwei Objekte vom Typ DistanceCalculator hinzufügen und das resultierende Objekt vom selben Typ zurückgeben können, dh das zurückgegebene Objekt ist vom Typ DistanceCalculator.

public Int32 Feet

       {

           get { return feet; }

       }

       public Int32 Inch

       {

           get { return inch; }

       }

So können Sie zwei Instanzen der DistanceCalculator-Klasse erstellen und die überladene Operatorfunktion nutzen, um das Ergebnis einem anderen Objekt desselben Typs zuzuweisen.

static void Main(string[] args)

       {

           DistanceCalculator obj1 = new DistanceCalculator(1, 11);

           DistanceCalculator obj2 = new DistanceCalculator(1, 2);

           DistanceCalculator obj3 = obj1 + obj2;

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

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

           Console.Read();

       }