Tym razem poznasz jak przeładować operatory konwersji jawne i niejawne. Co to jest tak naprawdę ten operator konwersji? Jest on wywoływany wtedy gdy chcemy zamienić int na byte wtedy jest wywoływany operator konwersji niejawny np.:
byte y= 23 ;
int x = y ;
Kiedy przypisujemy ‘y’ do ‘x’ wywołujemy również niejawny operator konwersji z byte do int. A co to jest jawny operator konwersji? To taki który korzysta z rzutowania czyli castingu. My teraz możemy przeładować takie operatory konwersji, użyjemy naszej starej klasy Pojazd oraz przeładujemy operator jawny i niejawny, aby mieć wpływ na to gdyby ktoś chciał przypisać jakiś obiekt klasy Pojazd do na przykład typu int. Ale jeszcze zanim to zrobimy przejdziemy do ogólnej deklaracji:
specyfikator_dostępu static typ_konwersji operator typ(parametr)
{
…
}
Gdzie typ_konwersji jest jednym z typów konwersji może on przyjmować następujące wartości:
impilicit – konwersja niejawna.
expilicit – konwersja jawna.
Parametr musi być takiego samego typu jak klasa, w której zadeklarowano przeładowanie operatorów konwersji.
Ok. Przejdźmy zatem do jakiegoś prostego przykładu:
Początek kodu:
using System;
class Pojazd
{
public int pasazerowie;
public double spalanie;
public double pojemnosc;
public Pojazd(int pas, double spal, double poj)
{
pasazerowie = pas;
spalanie = spal;
pojemnosc = poj;
}
public static implicit operator double(Pojazd p1)
{
return p1.pojemnosc * p1.pasazerowie * p1.spalanie;
}
}
class Pokaz
{
public static void Main()
{
Pojazd maluch = new Pojazd(4, 4.3, 29.7);
Pojazd polonez = new Pojazd(5, 7.8, 37.9);
double wartosc = maluch;
Console.WriteLine(„Zmienna \’wartosc\’ wynosi : ” + wartosc);
}
}
Koniec kodu:
Korzystamy w tym programie z naszej klasy Pojazd, i deklarujemy w niej przeładowani operatora konwersji niejawnej na double, oznacza to że teraz każdy zapis takiego typu:
double wartosc = maluch;
Będzie powodował wywołanie kodu który zawiera nasz przeładowany operator konwersji. Czym się różni operator jawny od niejawnego, głównie tym że używając jawnego operatora chcąc przypisać do zmiennej wartosc obiekt maluch musieli byś my zastosować rzutowanie czyli casting. A oto kod który wykorzystuje jawny operator konwersji.
Początek kodu:
using System;
class Pojazd
{
public int pasazerowie;
public double spalanie;
public double pojemnosc;
public Pojazd(int pas, double spal, double poj)
{
pasazerowie = pas;
spalanie = spal;
pojemnosc = poj;
}
public static explicit operator double(Pojazd p1)
{
return p1.pojemnosc * p1.pasazerowie * p1.spalanie;
}
}
class Pokaz
{
public static void Main()
{
Pojazd maluch = new Pojazd(4, 4.3, 29.7);
Pojazd polonez = new Pojazd(5, 7.8, 37.9);
double wartosc = (double) maluch;
Console.WriteLine(„Zmienna \’wartosc\’ wynosi : ” + wartosc);
}
}
Koniec kodu:
Ok. sam widzisz na czym polega różnica, teraz rodzi się pytanie którego używać? Jawnego czy niejawnego? Odpowiedź jest ciężka i najlepiej będzie jak sam wyrobisz sobie swoje zdanie na ten temat, korzystanie z jawnej konwersji jest bardziej bezpieczne ale też trochę uciążliwe dla klas które to proszą się o stosowanie niejawnej konwersji, czyli na przykład konwersja przeprowadza w sobie bardzo proste działanie. Ale decyzja zależy od ciebie, nie ma tutaj nic narzuconego.