W tym etapie zdefiniujesz mechanizmy konwersji ułamków do innych typów - konwersje automatyczne i rzutowanie.
Wykonuj zadania w podanej kolejności.
-
W projekcie Class library dodaj nową klasę. Plik nazwij
BigRationalConversions.cs
. -
Zmień nazwę klasy na
BigRational
. Dodaj słowo kluczowepartial
, zmieńclass
nastruct
. Korzystasz z funkcjonalności dzielenia klasy na wiele plikówpartial class
. Rozbudowę strukturyBigRational
w zakresie tego kroku przeprowadzisz w tym pliku. -
W projekcie z testami jednostkowymi utwórz plik o nazwie
BigRationalConversionsUnitTests.cs
. Możesz to wykonać kolejno poleceniami: Add > New Item .. > Basic Unit Test. Testy jednostkowe związane z implementacją równości ułamków zapisz w tym pliku. -
Zaimplementuj konwersję automatyczną z typów liczbowych całkowitych (
byte
, ...,uint
...,long
) naBigRational
. Zrealizujesz to za pomocą przeciążenia operatora odpowiedniego typu z użyciem słowa kluczowegoimplicit
. -
Zaimplementuj konwersję jawną z typu
BigRational
na pozostałe typy liczbowe z użyciem słowa kluczowegoexplicit
. Będą to konwersje z utratą dokładności. -
Uruchom wszystkie testy jednostkowe. Jest pewne prawdopodobieństwo, że wprowadzając do klasy mechanizmy domyślnych konwersji, niektóre z nich mogą teraz nie zostać zaliczone.
-
Nierozsądnym byłoby dostarczanie konwersji niejawnej z
double
naBigRational
. Poprzednio zrealizowałeś to w kroku 1 za pomocą konstruktoraBigRational(double)
(w nomenklaturze C++ nazywa się go konstruktorem konwertującym). Zamiana liczby, np.2.124267
na odpowiadający jej ułamek jest to procesem złożonym i czasami pracochłonnym. Wprowadzenie niejawnego działania konwersji spowoduje co prawda bardziej zwarty i ładniejszy zapis wyrażeń arytmetycznych (np.BigRational.Half + 2.73415
), ale kodujący może nie zwrócić uwagi na fakt długotrwałego obliczania takiego wyrażenia. Zatem, zdefiniuj jawną konwersję zdouble
naBigRational
. Kodujący świadomie będzie musiał rzutować. -
Opracuj stosowne testy jednostkowe dla konwersji liczbowych.
-
Przenieś kod implementujący
BigRational Parse(string)
orazbool TryParse(string, out BigRational)
który realizowałeś w kroku 1 do tej części klasy. raczej tu jest jego miejsce. -
Statyczna klasa
System.Convert
zbiera wszystkie metody konwertujące z jednego typu do innego. Na przykładConvert.ToInt64()
. Załóżmy, że naszym celem jest dołączenie do tej listy jeszcze jednej pozycji:Convert.ToInt64(BigRational)
(czyli konwersji zBigRational
nalong
). Jest to możliwe za pomocą implementacji interfejsuIConvertible
. Zaimplementuj tę konwersję (pozostałe pozostaw zNotImplementedException
).
-
Poczytaj o konwersjach ogólnie oraz o konwersjach domyślnych i jawnych. Wprowadzenie konwersji nie wymaga implementowania jakiegokolwiek interfejsu.
-
Poczytaj o implementacji interfejsu
IConvertible
. Dołączanie do klasyConvert
metod konwersji własnych typów na typy tam predefiniowane wymaga zaimplementowania interfejsuIConvertible
- musimy napisać kod dla kilkunastu (kilkudziesięciu) metod. Zaletą takiej implementacji jest fakt, iż z naszej klasy można korzystać w standardowy sposób. Przeczytaj również: Type conversion example in C# .NET using the IConvertible interface. -
Poczytaj o konwersjach w .NET oraz C#: Type Conversion in the .NET Framework.
-
Raczej nie stosuje się konwersji jawnych i niejawnych dla
string
- od tego są dostarczane dedykowane metody (Parse
orazTryParse
).