Zapoznanie studenta z projektowaniem wymiennych komponentów systemowych za pomocą interfejsów. Celem jest stworzenie kontraktu dla operacji zapisu i odczytu, który może być zrealizowany przez zupełnie różne technologie składowania informacji.
Zaprojektuj rdzeń modułu zapisu danych dla aplikacji typu Notatnik, który musi wspierać różne miejsca docelowe. Stwórz interfejs o nazwie "IDataProvider", definiujący metody Save(string data) oraz string Load(). Następnie zaimplementuj dwie klasy: "DatabaseProvider", która symuluje połączenie z bazą SQL (wypisując komunikat o transakcji), oraz "FileProvider", która symuluje zapis do pliku tekstowego na dysku. Twoim zadaniem jest stworzenie klasy "ManagerDokumentu", która nie wie, gdzie dane są zapisywane, a jedynie operuje na obiekcie typu IDataProvider. Program musi umożliwić użytkownikowi zmianę miejsca zapisu w trakcie działania aplikacji (np. poprzez menu wyboru). Przetestuj system, wpisując tekst notatki i wysyłając ją najpierw do bazy, a następnie do pliku bez zmiany logiki głównej managera. Takie podejście uczy projektowania systemów "decoupled", w których poszczególne części są od siebie niezależne. Program powinien na końcu potwierdzić pomyślne zakończenie operacji dla obu kanałów. Finalna dokumentacja powinna zawierać uzasadnienie, dlaczego w tym przypadku interfejs jest lepszy od klasy abstrakcyjnej.
Praktyczne zastosowanie klas abstrakcyjnych do modelowania ról zawodowych posiadających wspólne atrybuty, ale realizujących inne zadania. Student uczy się wymuszać implementację specyficznych aktywności (np. nauczanie) przy jednoczesnym zachowaniu wspólnej bazy danych.
Budujesz system kadrowy dla uczelni wyższej, który musi zarządzać profilami różnych pracowników naukowych. Stwórz klasę abstrakcyjną "PracownikUczelni", która przechowuje imię, nazwisko i stopień naukowy, a także definiuje abstrakcyjną metodę Pracuj(). Musisz zaimplementować co najmniej dwie klasy konkretne: "Wykladowca" (którego praca polega na prowadzeniu wykładów) oraz "Badacz" (który zajmuje się przeprowadzaniem eksperymentów). Każdy z nich w metodzie Pracuj() powinien wypisywać specyficzny dla siebie komunikat o wykonywanych czynnościach. Dodatkowo w klasie bazowej zdefiniuj zwykłą właściwość, która przechowuje numer ID pracownika – wspólny dla wszystkich. Program w konsoli powinien stworzyć listę pracowników, dodać do niej przedstawicieli obu grup i w jednej pętli uruchomić ich codzienne obowiązki. Zadanie to pokazuje, jak klasy abstrakcyjne pozwalają na uporządkowanie struktury organizacyjnej w kodzie. Dzięki temu każdy nowy typ pracownika (np. Administrator) będzie musiał również określić swoją metodę pracy. Finalny raport powinien listować wszystkich pracowników wraz z opisem ich aktualnej aktywności zawodowej. Program kończy pracę po wyświetleniu podsumowania etatów na danym wydziale.
Integracja wiedzy o interfejsach w kontekście systemów automatyki budynkowej (Smart Home). Student uczy się, jak za pomocą wspólnego kontraktu sterować urządzeniami o skrajnie różnych zasadach fizycznego działania (grzanie vs chłodzenie).
Projektujesz system klimatyczny dla inteligentnego domu, który musi utrzymać zadaną temperaturę w pomieszczeniu. Zdefiniuj interfejs "ITemperatureController" z metodami IncreaseTemp() oraz DecreaseTemp(). Twoim zadaniem jest zaimplementowanie tego interfejsu w dwóch różnych urządzeniach: "PiecuGazowym" (zwiększa temperaturę o 5 stopni) oraz "Klimatyzatorze" (zmniejsza o 2 stopnie). Dodatkowo stwórz klasę "MenedżerKlimatu", która zarządza listą wszystkich urządzeń grzewczych i chłodzących w całym domu. Menedżer powinien posiadać metodę "UstawDziennyTryb", która w zależności od potrzeb (zbyt zimno/zbyt ciepło) wywołuje odpowiednie metody na wszystkich zarejestrowanych jednostkach. Program w konsoli powinien symulować czujnik temperatury – jeśli odczyt spadnie poniżej 18 stopni, system powinien aktywować wszystkie kontrolery temperatury w trybie grzania. Rozwiązanie to pokazuje, jak interfejsy pozwalają na ujednolicenie sterowania urządzeniami bez wnikania w ich wewnętrzną mechanikę działania. Program kończy się wyświetleniem raportu o aktualnym stanie termicznym i kosztach energii (opcjonalnie). Jest to modelowy przykład sterowania polimorficznego w systemach czasu rzeczywistego.
Wykorzystanie klasy abstrakcyjnej jako „szablonu pracy” (Template Method Pattern). Student uczy się definiować stałe kroki algorytmu w klasie bazowej, pozostawiając szczegóły implementacyjne (np. formatowanie pliku) klasom specjalistycznym.
Budujesz moduł generowania raportów miesięcznych dla działu finansów, który musi obsługiwać eksport do formatów PDF oraz Excel. Stwórz klasę abstrakcyjną "GeneratorRaportu", która posiada jedną zwykłą metodę Eksportuj(string dane). Metoda ta powinna realizować pewien stały schemat: najpierw wywołać abstrakcyjną metodę Naglowek(), potem sformatować treść i na końcu wywołać abstrakcyjną metodę Stopka(). Twoim zadaniem jest stworzenie klas "PdfGenerator" oraz "ExcelGenerator", które dostarczą specyficznego formatowania dla nagłówków i stopek (np. PDF używa ramek, a Excel komórek). Dzięki takiemu podejściu, logika główna eksportu jest napisana tylko raz w klasie bazowej, a klasy pochodne „wypelniają luki” specyficzne dla danego formatu. Program w konsoli powinien pozwolić użytkownikowi na wybór formatu wyjściowego i wyświetlić wygenerowany dokument w oknie tekstowym. Zadanie to uczy, jak projektować algorytmy, które są spójne w całej aplikacji, ale różnią się detalami wizualnymi. Jest to jedna z najczęściej stosowanych technik w profesjonalnych frameworkach raportowych. Finalny raport powinien zawierać przykładowe dane sprzedażowe sformatowane w wybrany sposób.
Zastosowanie interfejsów do oceny i sortowania różnorodnych obiektów (filmy, gry, książki). Student uczy się łączyć dziedziczenie z implementacją wielu interfejsów w celu budowy zaawansowanych systemów rankingowych.
Jako programista portalu typu "Katalog Rozrywki", musisz ujednolicić sposób oceniania różnych produktów przez użytkowników. Stwórz interfejs "IOcenialny", który posiada metody DodajOcene(int ocena) oraz Wlasciwosc SredniaOcena (tylko do odczytu). Następnie zaimplementuj ten interfejs w trzech różnych klasach: "Film", "Ksiazka" oraz "GraWideo". Każda z tych klas może należeć do innej hierarchii dziedziczenia, ale dzięki wspólnemu interfejsowi będziesz mógł stworzyć jedną listę "Top 10" zawierającą produkty wszystkich typów. Twoim zadaniem jest opracowanie logiki zbierania ocen wewnątrz każdej klasy (np. przy użyciu prywatnej tablicy lub listy ocen) i wyliczania z nich średniej. Program powinien umożliwić użytkownikowi wystawienie kilku not dla filmu i gry, a następnie wyświetlić ranking popularności od najwyższej oceny. To zadanie pokazuje, jak interfejsy pozwalają na porównywanie "rzeczy nieporównywalnych", o ile mają one wspólną cechę (możliwość oceny). Dzięki temu Twój katalog jest w pełni uniwersalny i gotowy na dodawanie nowych kategorii produktów w przyszłości. Program kończy pracę wyświetleniem najpopularniejszego tytułu w całym serwisie bez względu na kategorię.