Utworzenie klasy katalogu wykorzystującej indeksatory do alternatywnego dostępu do danych (nie tylko po numerze porządkowym). Student uczy się projektowania wygodnych interfejsów dostępu do danych wewnątrz własnych obiektów.
Zaprojektuj klasę o nazwie "Katalog", która przechowuje listę produktów jako prostą strukturę wewnętrzną (możesz użyć tablicy stringów dla uproszczenia). Klasa musi oferować dwa sposoby dostępu do danych za pomocą indeksatorów. Pierwszy z nich pozwala na pobranie lub zmianę opisu produktu za pomocą standardowego numeru indeksu (int). Drugi indeksator, będący wersją rozszerzoną, powinien pozwalać na sprawdzenie ceny produktu na podstawie jego nazwy (string jako indeks). Twoim celem jest zapewnienie, aby próba dostępu do nieistniejącego indeksu lub nazwy nie powodowała awarii programu, lecz zwracała stosowną informację, np. "Brak w bazie". Program w metodzie Main powinien wypełnić katalog kilkoma przykładowymi danymi i zademonstrować ich odczyt za pomocą obu rodzajów indeksatorów. Dzięki takiemu rozwiązaniu Twój obiekt zachowuje się bardzo naturalnie, przypominając w działaniu słownik lub bazę klucz-wartość. Jest to świetny przykład na to, jak C# pozwala na budowanie bardzo eleganckich struktur danych przyjaznych dla innych programistów. Pamiętaj, aby opisać w dokumentacji sposób przeszukiwania tablicy wewnątrz indeksatora tekstowego.
Praktyczne wykorzystanie modyfikatora out do zwracania wielu wyników cząstkowych z jednej metody statycznej. Student uczy się optymalizować przepływ danych w programie poprzez grupowanie wyników obliczeń.
Pracujesz nad modułem statystycznym dla aplikacji przetwarzającej wyniki egzaminów studenckich. Twoim zadaniem jest napisanie metody, która przyjmuje jako wejście tablicę liczb całkowitych (oceny lub punkty) i zwraca za jednym razem trzy ważne informacje: wartość minimalną, wartość maksymalną oraz łączną sumę punktów. Aby zrealizować to wymaganie, musisz skorzystać z parametrów wyjściowych typu out w sygnaturze metody. Takie podejście jest znacznie wygodniejsze niż pisanie trzech osobnych metod, które trzy razy musiałyby przeglądać tę samą tablicę. Twoja metoda powinna być statyczna i umieszczona w klasie narzędziowej o nazwie Statystyka. Program w konsoli powinien pobrać od użytkownika ciąg liczb rozdzielonych spacją, przetworzyć go i wyświetlić kompletny raport statystyczny. Zwróć uwagę na inicjalizację zmiennych out przed wyjściem z metody – jest to wymóg kompilatora języka C#. Dodatkowo zapewnij obsługę przypadku, gdy tablica wejściowa jest pusta lub null. Taki moduł jest bazą dla wielu systemów analitycznych typu Business Intelligence. Finalnie zaprezentuj wyniki w czytelnej formie liczbowej na ekranie terminala.
Opracowanie hierarchii klas opisującej królestwo zwierząt z wykorzystaniem dziedziczenia oraz słowa kluczowego base. Student uczy się rozszerzać funkcjonalność klas bazowych bez konieczności modyfikowania ich oryginalnego kodu.
Twoje zadanie polega na stworzeniu systemu ewidencji mieszkańców ogrodu zoologicznego. Zacznij od zdefiniowania klasy bazowej o nazwie "Zwierze", która posiada wspólne cechy, takie jak nazwa gatunkowa oraz wiek. Następnie stwórz dwie klasy pochodne, na przykład "Ptak" (dodające pole rozpiętość skrzydeł) oraz "Ssak" (dodające informację o rodzaju futra). Bardzo ważne jest, aby każda z klas pochodnych posiadała konstruktor, który poprawnie deleguje część obowiązków inicjalizacyjnych do konstruktora klasy bazowej przy użyciu : base(...). Dzięki temu unikniesz powielania kodu przypisującego nazwę i wiek w każdej klasie z osobna. Dodaj do każdej z klas metodę o nazwie WydajGlos, która będzie wirtualna w klasie bazowej i nadpisana w klasach szczegółowych (np. ptak może świergotać, a ssak wydawać inny dźwięk). Program ma umożliwić utworzenie małej kolekcji zwierząt i wyświetlenie ich pełnej charakterystyki na podstawie danych zawartych w hierarchii. Taka struktura ułatwia późniejsze dodawanie nowych gatunków, np. gadów czy ryb, poprzez proste rozszerzenie istniejących definicji. Zadanie to uczy poprawnego myślenia obiektowego w oparciu o wspólne cechy obiektów świata rzeczywistego. Napisz program tak, aby na końcu wyświetlił on listę wszystkich zarejestrowanych zwierząt z ich unikalnymi parametrami.
Zastosowanie polimorfizmu do dynamicznego wyliczania cen usług w zależności od typu klienta. Student uczy się projektować elastyczne cenniki biletowe oparte na nadpisywaniu metod wirtualnych.
Zaprojektuj system do obsługi biletów dla kina lub teatru. Klasa bazowa o nazwie "Bilet" powinna zawierać podstawową cenę wejściówki oraz wirtualną metodę o nazwie ObliczCene(). Musisz stworzyć kilka klas pochodnych, reprezentujących różne typy zniżek, np. "BiletUlgowy" (zniżka 50% ważna dla uczniów) oraz "BiletSeniora" (zniżka stała, np. -10 zł od ceny bazowej). W każdej z tych klas nadpisz metodę obliczeniową tak, aby zwracała odpowiednio obniżoną kwotę. To jednak nie wszystko – stwórz również klasę "BiletVIP", w której cena jest wyższa o opłatę za rezerwację miejsca premium. Kluczowym fragmentem zadania jest demonstracja polimorfizmu: stwórz tablicę typu Bilet[], wypełnij ją obiektami różnych klas (ulgowy, VIP, normalny) i w jednej pętli foreach zsumuj całkowity przychód ze sprzedanych biletów. Program ma wyświetlić szczegółowe zestawienie, pokazując typ sprzedanego biletu oraz jego kwotę po rabacie. Rozwiązanie to pokazuje, dlaczego polimorfizm jest tak ceniony przy budowaniu systemów sprzedażowych – pozwala on na dodawanie nowych rodzajów ulg bez dotykania głównej logiki sumującej. Program musi poprawnie zaokrąglać kwoty końcowe i wyświetlać je w formacie walutowym.
Demonstracja różnicy między nadpisywaniem metod wirtualnych a ich przesłanianiem przy użyciu słowa kluczowego new. Student zgłębia tajniki wiązania dynamicznego i statycznego w hierarchii klas C#.
Zaprojektuj system do drukowania różnych typów dokumentów biurowych. Klasa bazowa o nazwie "Dokument" posiada metodę public virtual void Print(), która wypisuje ogólny opis strony. Stwórz klasę "Raport", która nadpisuje tę metodę (używając override), oraz klasę "DokumentTajny", która jedynie przesłania metodę bazową (używając słowa kluczowego new). Twoim celem jest przeprowadzenie testu polegającego na przypisaniu obiektów obu klas pochodnych do zmiennych typu bazowego Dokument. Po wywołaniu metody Print() na obu tych zmiennych, zaobserwujesz, że jeden obiekt wywoła nową wersję metody, a drugi – wersję z klasy bazowej. Jest to krytyczny test zrozumienia mechanizmów OOP, który uczy świadomego projektowania API i unikania tzw. "method hiding" tam, gdzie oczekiwany jest polimorfizm. Program musi wygenerować zestawienie logów, które wyjaśniają użytkownikowi, co się stało przy każdym wywołaniu. Zadanie to jest świetną okazją do dyskusji nad bezpieczeństwem i czytelnością kodu w dużych systemach klasy Enterprise. Opisz w sprawozdaniu wynik tego porównania, wskazując który mechanizm (new czy override) zachowuje własność polimorficzną. Program powinien na końcu wywołać metody po rzutowaniu na typy szczegółowe, aby pokazać, że "ukryta" metoda nadal istnieje w pamięci.