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
Zobacz listę szkoleń


