Artykuł

freeimages.com freeimages.com
lis 17 2016
0

Przeciążanie operatorów w C#

C# posiada w swojej ofercie wiele operatorów, które pełnią rozmaite funkcje. Z pewnością dobrze znacie większość z nich, a jeśli nie to warto nadrobić swoje braki przeglądając dokumentację MSDN.

Z operatorów mogą korzystać również nasze własne obiekty, ale w normalnej sytuacji nie będą one wiedziały jak. Na szczęście twórcy C# dali nam narzędzia, dzięki którym będziemy mogli nauczyć nasze klasy zupełnie nowych możliwości.

Czy nie byłoby fajnie, gdyby obiekty faktur można było dodawać do siebie i dzięki temu otrzymalibyśmy sumę wszystkich faktur? Okazuje się, że w C# jest to banalnie proste:)

Operator w własnej klasie

Tak jak napisałem we wstępnie, przeciążanie operatorów na potrzeby własnych klas jest bardzo proste, dlatego też nasze prace zaczniemy od zdefiniowania bazowej wersji klasy Invoice:

public class Invoice
{
    public DateTimeOffset InvoiceDate { get; set;}
    
    public string CustomerName { get; set;}

    public decimal Amount { get; set; }
}

W kolejnym kroku możemy utworzyć dwa przykładowe obiekty tejże klasy:

Invoice inv1 = new Invoice{
    InvoiceDate = DateTimeOffset.Now,
    CustomerName = "Abc inc.",
    Amount = 999.99M
};

Invoice inv2 = new Invoice{
    InvoiceDate = DateTimeOffset.Now.AddHours(-1),
    CustomerName = "Yyz limited",
    Amount = 666.78M
};

Gdybyśmy teraz spróbowali dodać oba obiekty do siebie:

Console.WriteLine(inv1 + inv2);

To szybko okaże się, że taka operacja jest niemożliwa, a powyższy kod się nie kompiluje. Aby to zmienić, należy zmodyfikować klasę Invoice, do której dodamy obsługę operatora. W tym celu należy zdefiniować statyczną konstrukcję wskazującą na interesujący nas operator:

public class Invoice
{
    public DateTimeOffset InvoiceDate { get; set;}
    
    public string CustomerName { get; set;}

    public decimal Amount { get; set; }

    public static decimal operator +(Invoice inv1, Invoice inv2)
    {
        return inv1.Amount + inv2.Amount;
    }
}

Gdy teraz będziemy chcieli korzystać z operatora dodawania, to okaże się, że będzie to jak najbardziej możliwe! Konstrukcja:

Console.WriteLine(inv1 + inv2);

Spowoduje wyświetlenie w konsoli sumy obu faktur:)

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus