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