Platforma e-learningowa
Część sekcji Programowanie obiektowe ścieżki Java w Coddy. Lekcja 84 z 87.
Witamy w rozdziale Wyzwania końcowe! Te wyzwania mają sprawdzić, jak dobrze opanowałeś wszystkie zagadnienia związane z OOP, których nauczyłeś się w trakcie tego kursu.
W tym wyzwaniu zbudujesz system platformy e-learningowej, który łączy dziedziczenie, interfejsy, polimorfizm, enkapsulację i wzorce projektowe w spójną aplikację.
Twoja platforma powinna modelować relacje między kursami, studentami i instruktorami. Zastanów się, jak klasę bazową User można rozszerzyć o klasy Student i Instructor, jak kursy zawierają lekcje oraz jak działa śledzenie zapisów studentów na kursy.
Zastanów się, które zasady OOP mają zastosowanie: użyj hermetyzacji, aby chronić dane użytkowników, dziedziczenia, aby współdzielić wspólne zachowanie, interfejsów, aby definiować kontrakty, takie jak Enrollable lub Completable, oraz polimorfizmu, aby jednakowo obsługiwać różne typy użytkowników.
Powodzenia w zastosowaniu wszystkiego, czego się nauczyłeś!
Wyzwanie
ŁatwyStwórzmy platformę e-learningową, która łączy wszystkie koncepcje OOP, które opanowałeś w trakcie tego kursu! Stworzysz system modelujący relacje między kursami, studentami i instruktorami z wykorzystaniem dziedziczenia, interfejsów, polimorfizmu i enkapsulacji.
Rozmieścisz swój kod w sześciu plikach:
Enrollable.java: Utwórz interfejs definiujący kontrakt dla operacji zapisu. Powinien deklarować metodyenroll(Student student), która zwraca wartość boolean, orazgetEnrolledCount(), która zwraca wartość int.User.java: Utwórz abstrakcyjną klasę bazową reprezentującą dowolnego użytkownika platformy. Dodaj prywatne polaid(String) iname(String), konstruktor inicjalizujący oba pola, odpowiednie metody pobierające oraz abstrakcyjną metodęgetRole(), która zwraca wartość String opisującą rolę użytkownika.Student.java: Utwórz klasę rozszerzającąUser. Dodaj prywatną ArrayList do śledzenia identyfikatorów kursów, na które zapisano studenta. Dodaj konstruktor wywołujący konstruktor klasy nadrzędnej, zaimplementujgetRole(), aby zwracała"Student", oraz dodaj metodyaddCourse(String courseId)igetEnrolledCourseCount(). NadpisztoString(), aby zwracała"Student: [name] ([enrolledCount] courses)".Instructor.java: Utwórz klasę rozszerzającąUser. Dodaj prywatne polespecialty(String). Dodaj konstruktor przyjmujący id, name i specialty, zaimplementujgetRole(), aby zwracała"Instructor", dodaj metodę pobierającą specialty i nadpisztoString(), aby zwracała"Instructor: [name] - [specialty]".Course.java: Utwórz klasę implementującąEnrollable. Dodaj prywatne polacourseId(String),title(String),instructor(Instructor) oraz ArrayList zapisanych studentów. Konstruktor przyjmuje courseId, title i instructor. Zaimplementujenroll(Student student), aby dodawała studenta do listy, wywoływała metodęaddCourse()studenta z ID tego kursu i zwracała true. ZaimplementujgetEnrolledCount(). Dodaj metodęgetDetails(), która zwraca ID kursu w dosłownych nawiasach kwadratowych, a następnie tytuł i imię instruktora, tworzone jako"[" + courseId + "] " + title + " by " + instructorName.Main.java: Zbuduj swoją platformę! Otrzymasz ciąg poleceń rozdzielonych przecinkami:ADD_INSTRUCTOR:id:name:specialtyADD_STUDENT:id:nameADD_COURSE:courseId:title:instructorIdENROLL:studentId:courseIdINFO:userId
Przechowuj kolekcje instruktorów, studentów i kursów. Przetwórz każde polecenie i wypisz:
- ADD_INSTRUCTOR:
Instructor added: [name] - ADD_STUDENT:
Student added: [name] - ADD_COURSE:
Course added: [title] - ENROLL:
[studentName] enrolled in [courseTitle] - INFO: Wypisz wynik
toString()użytkownika
Po przetworzeniu wszystkich poleceń wypisz
--- Platform Summary ---, a następnie szczegóły każdego kursu i liczbę zapisanych studentów w formacie[courseDetails] - [count] student(s).
Otrzymasz jedno wejście: ciąg poleceń rozdzielonych przecinkami.
Na przykład dla wejścia ADD_INSTRUCTOR:I001:Dr. Smith:Java,ADD_STUDENT:S001:Alice,ADD_STUDENT:S002:Bob,ADD_COURSE:C001:OOP Fundamentals:I001,ENROLL:S001:C001,ENROLL:S002:C001,INFO:S001,INFO:I001 wynikiem będzie:
Instructor added: Dr. Smith
Student added: Alice
Student added: Bob
Course added: OOP Fundamentals
Alice enrolled in OOP Fundamentals
Bob enrolled in OOP Fundamentals
Student: Alice (1 courses)
Instructor: Dr. Smith - Java
--- Platform Summary ---
[C001] OOP Fundamentals by Dr. Smith - 2 student(s)To wyzwanie łączy dziedziczenie (hierarchię User), interfejsy (Enrollable), polimorfizm (różne typy użytkowników z własnymi implementacjami toString) oraz enkapsulację (prywatne pola z kontrolowanym dostępem) w spójny system!
Spróbuj swoich sił
import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: Utwórz kolekcje do przechowywania instruktorów, studentów i kursów
// Wskazówka: Użyj HashMap z id jako kluczem, aby ułatwić wyszukiwanie
// TODO: Podziel input według przecinków, aby uzyskać poszczególne polecenia
// TODO: Przetwórz każde polecenie:
// - ADD_INSTRUCTOR:id:name:specialty -> Utwórz instruktora, dodaj go do kolekcji i wypisz "Instructor added: [name]"
// - ADD_STUDENT:id:name -> Utwórz studenta, dodaj go do kolekcji i wypisz "Student added: [name]"
// - ADD_COURSE:courseId:title:instructorId -> Utwórz kurs z instruktorem, dodaj go do kolekcji i wypisz "Course added: [title]"
// - ENROLL:studentId:courseId -> Zapisz studenta na kurs i wypisz "[studentName] enrolled in [courseTitle]"
// - INFO:userId -> Znajdź użytkownika (studenta lub instruktora) i wypisz wynik jego metody toString()
// TODO: Po przetworzeniu wszystkich poleceń wypisz "--- Platform Summary ---"
// TODO: Dla każdego kursu wypisz "[courseDetails] - [count] student(s)"
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneWprowadzenie do programowania obiektowegoKlasy a obiektySłowo kluczowe thisMetodyPola (atrybuty)Metoda konstruktoraPrzeciążanie konstruktoraPodsumowanie — prosty kalkulator4Dziedziczenie
Podstawy dziedziczenia (extends)Słowo kluczowe superPrzesłanianie metod (@Override)Łańcuch wywołań konstruktorówKlasa ObjectDziedziczenie jedno- i wielopoziomoweDlaczego Java nie obsługuje wielodziedziczenia klasPodsumowanie – hierarchia pracowników7Metody specjalne i klasa Object
Metoda toString()equals() i hashCode()Metoda clone()compareTo() i ComparableInterfejs ComparatorPodsumowanie — własne sortowanie10Obsługa wyjątków w programowaniu obiektowym
Hierarchia klas wyjątkówWłasne wyjątkiBłędy sprawdzane a niesprawdzaneWzorzec try-with-resourcesPodsumowanie – zweryfikowany użytkownik2Modyfikatory dostępu i enkapsulacja
Przegląd poziomów dostępuMetody pobierające i ustawiająceUkrywanie informacjiSłowo kluczowe finalPodsumowanie — menedżer kont bankowych5Polimorfizm
Podstawy przeciążania metodPrzesłanianie metod (w czasie wykonywania)Rzutowanie w górę i w dółOperator instanceofKlasy i metody abstrakcyjnePowtórka — kalkulator figur8Zaawansowane koncepcje OOP
Kompozycja a dziedziczenieAgregacja a kompozycjaKlasy wewnętrzne, zagnieżdżone i anonimoweEnumy i metody enumówRekordy (Java 16+)Klasy zapieczętowane (Java 17+)11Wzorce projektowe — część 1
Wprowadzenie do wzorców projektowychWzorzec SingletonWzorzec FactoryWzorzec BuilderWzorzec ObserverWzorzec Strategy14Końcowe wyzwania
Platforma e-learningowaSystem bankowyTworzenie postaci do gryWypożyczalnia pojazdów3Właściwości klas i składowe statyczne
Zmienne instancji a zmienne statyczneMetody statyczneBloki statyczneStałe (static final)Powtórka – Counter i Utility6Interfejsy i klasy abstrakcyjne
Wprowadzenie do interfejsówImplementowanie interfejsówImplementacja wielu interfejsówMetody domyślne i statyczne w interfejsieKlasy abstrakcyjne a interfejsyInterfejsy funkcyjnePodsumowanie — system płatnościPoćwicz samodzielnie: Kompilator Java online