Skip to content

Latest commit

 

History

History
39 lines (20 loc) · 4.53 KB

step04.md

File metadata and controls

39 lines (20 loc) · 4.53 KB

Krok 4. Konwersje

W tym etapie zdefiniujesz mechanizmy konwersji ułamków do innych typów - konwersje automatyczne i rzutowanie.

Wykonuj zadania w podanej kolejności.

Zadania do wykonania

  1. W projekcie Class library dodaj nową klasę. Plik nazwij BigRationalConversions.cs.

  2. Zmień nazwę klasy na BigRational. Dodaj słowo kluczowe partial, zmień class na struct. Korzystasz z funkcjonalności dzielenia klasy na wiele plików partial class. Rozbudowę struktury BigRational w zakresie tego kroku przeprowadzisz w tym pliku.

  3. 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.

  4. Zaimplementuj konwersję automatyczną z typów liczbowych całkowitych (byte, ..., uint..., long) na BigRational. Zrealizujesz to za pomocą przeciążenia operatora odpowiedniego typu z użyciem słowa kluczowego implicit.

  5. Zaimplementuj konwersję jawną z typu BigRational na pozostałe typy liczbowe z użyciem słowa kluczowego explicit. Będą to konwersje z utratą dokładności.

  6. 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.

  7. Nierozsądnym byłoby dostarczanie konwersji niejawnej z double na BigRational. Poprzednio zrealizowałeś to w kroku 1 za pomocą konstruktora BigRational(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ę z double na BigRational. Kodujący świadomie będzie musiał rzutować.

  8. Opracuj stosowne testy jednostkowe dla konwersji liczbowych.

  9. Przenieś kod implementujący BigRational Parse(string) oraz bool TryParse(string, out BigRational) który realizowałeś w kroku 1 do tej części klasy. raczej tu jest jego miejsce.

  10. Statyczna klasa System.Convert zbiera wszystkie metody konwertujące z jednego typu do innego. Na przykład Convert.ToInt64(). Załóżmy, że naszym celem jest dołączenie do tej listy jeszcze jednej pozycji: Convert.ToInt64(BigRational) (czyli konwersji z BigRational na long). Jest to możliwe za pomocą implementacji interfejsu IConvertible. Zaimplementuj tę konwersję (pozostałe pozostaw z NotImplementedException).

Podpowiedzi

  1. Poczytaj o konwersjach ogólnie oraz o konwersjach domyślnych i jawnych. Wprowadzenie konwersji nie wymaga implementowania jakiegokolwiek interfejsu.

  2. Poczytaj o implementacji interfejsu IConvertible. Dołączanie do klasy Convert metod konwersji własnych typów na typy tam predefiniowane wymaga zaimplementowania interfejsu IConvertible - 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.

  3. Poczytaj o konwersjach w .NET oraz C#: Type Conversion in the .NET Framework.

  4. Raczej nie stosuje się konwersji jawnych i niejawnych dla string - od tego są dostarczane dedykowane metody (Parse oraz TryParse).

Początek | Krok poprzedni | Krok następny