E-Learning-Plattform
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy. Lektion 84 von 87.
Willkommen im Kapitel „Abschließende Herausforderungen“! Diese Herausforderungen sollen deine Beherrschung aller OOP-Konzepte testen, die du im Laufe dieses Kurses gelernt hast.
In dieser Herausforderung entwickelst du ein System für eine E-Learning Platform, das Vererbung, Schnittstellen, Polymorphie, Kapselung und Entwurfsmuster zu einer zusammenhängenden Anwendung kombiniert.
Deine Plattform sollte die Beziehungen zwischen Kursen, Studierenden und Dozenten modellieren. Überlege, wie eine User-Basisklasse durch die Klassen Student und Instructor erweitert werden kann, wie Kurse Lektionen enthalten und wie die Einschreibungsverfolgung zwischen Studierenden und Kursen funktioniert.
Überlege, welche OOP-Prinzipien gelten: Verwende Kapselung, um Benutzerdaten zu schützen, Vererbung, um gemeinsames Verhalten zu teilen, Schnittstellen, um Verträge wie Enrollable oder Completable zu definieren, und Polymorphie, um verschiedene Benutzertypen einheitlich zu behandeln.
Viel Erfolg beim Anwenden von allem, was du gelernt hast!
Aufgabe
EinfachLass uns eine E-Learning-Plattform entwickeln, die alle OOP-Konzepte zusammenführt, die du im Laufe dieses Kurses gemeistert hast! Du erstellst ein System, das die Beziehungen zwischen Kursen, Studierenden und Dozenten mithilfe von Vererbung, Schnittstellen, Polymorphie und Kapselung modelliert.
Du organisierst deinen Code über sechs Dateien:
Enrollable.java: Erstelle eine Schnittstelle, die den Vertrag für Einschreibevorgänge definiert. Sie sollte die Methodenenroll(Student student), die einen booleschen Wert zurückgibt, undgetEnrolledCount(), die einen int zurückgibt, deklarieren.User.java: Erstelle eine abstrakte Basisklasse, die jeden Benutzer auf der Plattform repräsentiert. Füge private Felder fürid(String) undname(String), einen Konstruktor, der beide initialisiert, geeignete Getter sowie eine abstrakte MethodegetRole()hinzu, die einen String zurückgibt, der die Rolle des Benutzers beschreibt.Student.java: Erstelle eine Klasse, dieUsererweitert. Füge eine private ArrayList hinzu, um die IDs der belegten Kurse zu verfolgen. Füge einen Konstruktor hinzu, der den Konstruktor der Elternklasse aufruft, implementieregetRole()so, dass"Student"zurückgegeben wird, und füge die MethodenaddCourse(String courseId)undgetEnrolledCourseCount()hinzu. ÜberschreibetoString()so, dass"Student: [name] ([enrolledCount] courses)"zurückgegeben wird.Instructor.java: Erstelle eine Klasse, dieUsererweitert. Füge ein privates Feld fürspecialty(String) hinzu. Füge einen Konstruktor hinzu, der id, name und specialty entgegennimmt, implementieregetRole()so, dass"Instructor"zurückgegeben wird, füge einen Getter für specialty hinzu und überschreibetoString()so, dass"Instructor: [name] - [specialty]"zurückgegeben wird.Course.java: Erstelle eine Klasse, dieEnrollableimplementiert. Füge private Felder fürcourseId(String),title(String),instructor(Instructor) sowie eine ArrayList der eingeschriebenen Studierenden hinzu. Der Konstruktor nimmt courseId, title und instructor entgegen. Implementiereenroll(Student student), um den Studierenden zur Liste hinzuzufügen, die MethodeaddCourse()des Studierenden mit der ID dieses Kurses aufzurufen und true zurückzugeben. ImplementieregetEnrolledCount(). Füge eine MethodegetDetails()hinzu, die die Kurs-ID in eckigen Literalklammern, gefolgt vom Titel und dem Namen des Dozenten, in der Form"[" + courseId + "] " + title + " by " + instructorNamezurückgibt.Main.java: Baue deine Plattform! Du erhältst einen durch Kommas getrennten String von Befehlen:ADD_INSTRUCTOR:id:name:specialtyADD_STUDENT:id:nameADD_COURSE:courseId:title:instructorIdENROLL:studentId:courseIdINFO:userId
Verwalte Sammlungen von Dozenten, Studierenden und Kursen. Verarbeite jeden Befehl und gib Folgendes aus:
- ADD_INSTRUCTOR:
Instructor added: [name] - ADD_STUDENT:
Student added: [name] - ADD_COURSE:
Course added: [title] - ENROLL:
[studentName] enrolled in [courseTitle] - INFO: Gib die Ausgabe von
toString()des Benutzers aus
Gib nach allen Befehlen
--- Platform Summary ---aus, gefolgt von den Details jedes Kurses und der Anzahl der Einschreibungen im Format[courseDetails] - [count] student(s).
Du erhältst eine Eingabe: den durch Kommas getrennten Befehlsstring.
Bei der Eingabe 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 würde deine Ausgabe beispielsweise wie folgt aussehen:
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)Diese Herausforderung verbindet Vererbung (User-Hierarchie), Schnittstellen (Enrollable), Polymorphie (verschiedene Benutzertypen mit eigenen toString-Implementierungen) und Kapselung (private Felder mit kontrolliertem Zugriff) zu einem zusammenhängenden System!
Probier es selbst
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: Erstelle Collections, um Dozenten, Studenten und Kurse zu speichern
// Hinweis: Verwende HashMap mit id als Schlüssel für einfaches Nachschlagen
// TODO: Teile input am Komma auf, um einzelne Befehle zu erhalten
// TODO: Verarbeite jeden Befehl:
// - ADD_INSTRUCTOR:id:name:specialty -> Create instructor, add to collection, print "Instructor added: [name]"
// - ADD_STUDENT:id:name -> Create student, add to collection, print "Student added: [name]"
// - ADD_COURSE:courseId:title:instructorId -> Create course with instructor, add to collection, print "Course added: [title]"
// - ENROLL:studentId:courseId -> Student in Kurs einschreiben, "[studentName] enrolled in [courseTitle]" ausgeben
// - INFO:userId -> Finde Benutzer (Student oder Dozent) und gib deren toString() aus
// TODO: After processing all commands, print "--- Platform Summary ---"
// TODO: Für jeden Kurs "[courseDetails] - [count] student(s)" ausgeben
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienEinführung in die OOPKlassen vs. ObjekteDas Schlüsselwort thisMethodenFelder (Attribute)KonstruktormethodeÜberladen von KonstruktorenRückblick – Einfacher Taschenrechner4Vererbung
Grundlegende Vererbung (extends)Das Schlüsselwort superÜberschreiben von Methoden (@Override)KonstruktorverkettungDie Object-KlasseEinfach- und mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenRückblick – Mitarbeiterhierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-SchnittstelleRückblick – Benutzerdefinierte Sortierung2Zugriffsmodifikatoren & Kapselung
Übersicht der ZugriffsebenenGetter- und Setter-MethodenInformationsverbergungDas Schlüsselwort finalRückblick – Bankkontoverwaltung5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenRückblick – Formrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, verschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Versiegelte Klassen (Java 17+)11Entwurfsmuster Teil 1
Einführung in EntwurfsmusterSingleton-MusterFactory-MusterBuilder-MusterObserver-MusterStrategie-Muster14Abschließende Herausforderungen
E-Learning-PlattformBankingsystemEntwicklung einer SpielfigurFahrzeugvermietungsdienst3Klassen-Props & statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Wiederholung – Counter & Utility6Schnittstellen & abstrakte Klassen
Einführung in InterfacesInterfaces implementierenMehrere Interfaces implementierenDefault & Static in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesRückblick – ZahlungssystemÜbe selbstständig: Online-Java-Compiler