w , ,

Przeciążanie operatorów

W języku C# możliwe jest przeciążanie operatorów. Polega to na tym, że możemy przy użyciu słowa kluczowego

operator

zaprogramować dowolny operator w taki sposób, aby można było go wykorzystywać do własnych zaplanowanych celów.

Osobiście uważam, że używanie przeciążonych operatorów zaburza czytelność kodu i nie znam przypadku, w którym operator ten mogłby w znacznym stopniu ułatwić nam programowanie.

Postaram się przedstawić najbardziej sensowny przykład z użyciem operatorów.

Zadeklaruję klasę Missis


class Missis
{
 string _name;

public Missis(string imię, string nazwisko)
 {
 Name = imię;
 Surname = nazwisko;
 }

public string Name
 {
 get { return _name; }
 set { _name = value; }
 }

public string Surname
 {
 get { return _surname; }
 set { _surname = value; }
 }

}

Oraz Mister


class Mister
{
 string _name;
 string _surname;

public Mister(string imię, string nazwisko)
 {
 Name = imię;
 Surname = nazwisko;
 }
 public string Name
 {
 get { return _name; }
 set { _name = value; }
 }
 public string Surname
 {
 get { return _surname; }
 set { _surname = value; }
 }

public static Child operator +(Mister mister, Missis missis)
 {
 return new Child(mister, missis);
 }
}

Obie klasy deklarują w sobie imię oraz nazwisko. Oczywiście wygodniej byłoby wykorzystać mechanizm dziedziczenia, aby klasa Missis i Mister dziedziczyły po wspólnej klasie bazowej zawierającej te pola. Ale nie na tym chciałem się tutaj skupić. Przyjrzyjmy się teraz klasie Mister, a konkretniej statycznej metodzie, która zwraca nam instancję klasy Child. Jak widać, nie ma w tym nic skomplikowanego. Należy pamiętać, że metoda ta musi być metodą statyczną. Przed argumentami (zamiast nazwy) metody dopisujemy słówko kluczowe operator, a za nim wybrany operator. Jak zadziała metoda? Po wywołaniu statycznej funkcji, podając za parametry instancję klas Missis i Mister, otrzymamy nową instancję klasy Child, która w konstruktorze przyjmuje w/w instancję klas. Poniżej prezentuję klasę Child

class Child
{
 string _father;
 public string Father
 {
 get { return _father; }
 set { _father = value; }
 }
 string _mother;
 public string Mother
 {
 get { return _mother; }
 set { _mother = value; }
 }
 public Child(Mister mister, Missis missis)
 {
 Father = mister.Name + " " + mister.Surname;
 Mother = missis.Name + " " + missis.Surname;
 }
 public override string ToString()
 {
 return String.Format("My father is {0}. My mother {1}", Father, Mother);
 }
}

Dla przejrzystszego sprawdzenia działania operatora pozwoliłem sobie overrid’ować metodę ToString(), która przedstawi nam dziecko. Teraz wywołanie metody.

Mister mister = new Mister("John", "Kowalski");
Missis missis = new Missis("Ann", "Nowak");
Child child = mister + missis;
MessageBox.Show(child.ToString());

W moim przykładzie należy pamiętać, że wcześniej musimy stworzyć instancję klas Missis i Mister. Po ich zainicjalizowaniu, tworzymy uchwyt do klasy Child o nazwie „child”. Do uchwytu przypisujemy naszą funkcję z odpowiednimi parametrami. Tak jak już wcześniej pisałem, funkcja zwraca nam instancję klasy Child zależną od podanych parametrów. A oto wynik eksperymentu:

Co ciekawe, funkcja, w której definiujemy swój operator, może tylko przyjmować dwa argumenty. Operator nie działa przy podaniu więcej niż dwóch parametrów.

Error 1 Overloaded binary operator '+' takes two parameters

Napisane przez Przemysław Bykowski

Aktywny programista i energiczny trener. Specjalizuje się w Spring Boot i uczę go w ramach AkademiaSpring.pl. Po godzinach udzielam się na YouTubach. Więcej o mnie.

Dodaj odpowiedź

    Dodaj komentarz

    Data Binding w WinForms

    Singleton