E-Learning-Plattform
Teil des Abschnitts Objektorientierte Programmierung der Java-Journey von Coddy — Lektion 84 von 87.
Willkommen zum Kapitel der Abschlussherausforderungen! Diese Herausforderungen sind darauf ausgelegt, Ihre Beherrschung aller OOP-Konzepte zu testen, die Sie im Laufe dieses Kurses gelernt haben.
In dieser Herausforderung wirst du ein E-Learning-Plattform-System bauen, das Vererbung, Interfaces, Polymorphismus, Kapselung und Design Patterns in einer zusammenhängenden Anwendung kombiniert.
Ihre Plattform sollte die Beziehungen zwischen Kursen, Studenten und Dozenten modellieren. Überlegen Sie, wie eine User Basisklasse durch Student und Instructor Klassen erweitert werden kann, wie Kurse Lektionen enthalten und wie die Einschreibungsverfolgung zwischen Studenten und Kursen funktioniert.
Überlegen Sie, welche OOP-Prinzipien Anwendung finden: Verwenden Sie 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
EinfachLassen Sie uns eine E-Learning-Plattform bauen, die alle OOP-Konzepte vereint, die Sie in diesem Kurs gelernt haben! Sie werden ein System erstellen, das die Beziehungen zwischen Kursen, Studenten und Dozenten mithilfe von Vererbung, Schnittstellen, Polymorphismus und Kapselung modelliert.
Sie werden Ihren Code in sechs Dateien organisieren:
Enrollable.java: Erstellen Sie ein Interface, das den Vertrag für Einschreibungsoperationen definiert. Es sollte die Methodenenroll(Student student), die einen boolean zurückgibt, undgetEnrolledCount(), die einen int zurückgibt, deklarieren.User.java: Erstellen Sie eine abstrakte Basisklasse, die jeden Benutzer auf der Plattform repräsentiert. Fügen Sie private Felder fürid(String) undname(String) hinzu, einen Konstruktor, der beide initialisiert, entsprechende Getter und eine abstrakte MethodegetRole(), die einen String zurückgibt, der die Rolle des Benutzers beschreibt.Student.java: Erstellen Sie eine Klasse, dieUsererweitert. Fügen Sie eine private ArrayList hinzu, um die IDs der belegten Kurse zu verfolgen. Fügen Sie einen Konstruktor hinzu, der den Eltern-Konstruktor aufruft, implementieren SiegetRole()so, dass"Student"zurückgegeben wird, und fügen Sie die MethodenaddCourse(String courseId)undgetEnrolledCourseCount()hinzu. Überschreiben SietoString(), um"Student: [name] ([enrolledCount] courses)"zurückzugeben.Instructor.java: Erstellen Sie eine Klasse, dieUsererweitert. Fügen Sie ein privates Feld fürspecialty(String) hinzu. Fügen Sie einen Konstruktor hinzu, der id, name und specialty entgegennimmt, implementieren SiegetRole()so, dass"Instructor"zurückgegeben wird, fügen Sie einen Getter für specialty hinzu und überschreiben SietoString(), um"Instructor: [name] - [specialty]"zurückzugeben.Course.java: Erstellen Sie eine Klasse, dieEnrollableimplementiert. Fügen Sie private Felder fürcourseId(String),title(String),instructor(Instructor) und eine ArrayList mit eingeschriebenen Studenten hinzu. Der Konstruktor nimmt courseId, title und instructor entgegen. Implementieren Sieenroll(Student student), um den Studenten zur Liste hinzuzufügen, rufen Sie die MethodeaddCourse()des Studenten mit der ID dieses Kurses auf und geben Sie true zurück. Implementieren SiegetEnrolledCount(). Fügen Sie eine MethodegetDetails()hinzu, die"[courseId] [title] by [instructorName]"zurückgibt.Main.java: Bauen Sie Ihre Plattform! Sie erhalten einen durch Kommas getrennten String mit Befehlen:ADD_INSTRUCTOR:id:name:specialtyADD_STUDENT:id:nameADD_COURSE:courseId:title:instructorIdENROLL:studentId:courseIdINFO:userId
Verwalten Sie Sammlungen von Dozenten, Studenten und Kursen. Verarbeiten Sie jeden Befehl und geben Sie Folgendes aus:
- ADD_INSTRUCTOR:
Instructor added: [name] - ADD_STUDENT:
Student added: [name] - ADD_COURSE:
Course added: [title] - ENROLL:
[studentName] enrolled in [courseTitle] - INFO: Geben Sie die
toString()-Ausgabe des Benutzers aus
Geben Sie nach allen Befehlen
--- Platform Summary ---aus, gefolgt von den Details jedes Kurses und der Anzahl der Einschreibungen im Format[courseDetails] - [count] student(s).
Sie erhalten eine Eingabe: den durch Kommas getrennten Befehls-String.
Zum Beispiel 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äre Ihre Ausgabe:
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 kombiniert Vererbung (User-Hierarchie), Interfaces (Enrollable), Polymorphismus (verschiedene Benutzertypen mit ihren eigenen toString-Implementierungen) und Kapselung (private Felder mit kontrolliertem Zugriff) in einem zusammenhängenden System!
Spickzettel
Diese abschließende Herausforderung kombiniert mehrere OOP-Konzepte zu einem zusammenhängenden System:
Interfaces
Definieren Sie Verträge für Verhalten, das Klassen implementieren müssen:
public interface Enrollable {
boolean enroll(Student student);
int getEnrolledCount();
}Abstrakte Klassen
Erstellen Sie Basisklassen mit gemeinsamem Verhalten und abstrakten Methoden:
public abstract class User {
private String id;
private String name;
public User(String id, String name) {
this.id = id;
this.name = name;
}
public abstract String getRole();
}Vererbung
Erweitern Sie Basisklassen, um spezialisierte Typen zu erstellen:
public class Student extends User {
private ArrayList<String> enrolledCourses;
public Student(String id, String name) {
super(id, name);
this.enrolledCourses = new ArrayList<>();
}
@Override
public String getRole() {
return "Student";
}
}Interfaces implementieren
Klassen können Interfaces implementieren, um Verträge zu erfüllen:
public class Course implements Enrollable {
private ArrayList<Student> enrolledStudents;
@Override
public boolean enroll(Student student) {
enrolledStudents.add(student);
student.addCourse(courseId);
return true;
}
@Override
public int getEnrolledCount() {
return enrolledStudents.size();
}
}Polymorphismus
Verschiedene Klassen können Methoden überschreiben, um spezialisiertes Verhalten bereitzustellen:
@Override
public String toString() {
return "Student: " + name + " (" + enrolledCourses.size() + " courses)";
}Kapselung
Verwenden Sie private Felder mit kontrolliertem Zugriff über Methoden, um die Datenintegrität zu schützen und Beziehungen zwischen Objekten aufrechtzuerhalten.
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 Sammlungen zum Speichern von Dozenten, Studenten und Kursen
// Hinweis: Verwende eine HashMap mit id als Schlüssel für eine einfache Suche
// TODO: Teile die Eingabe durch Kommas, um einzelne Befehle zu erhalten
// TODO: Verarbeite jeden Befehl:
// - ADD_INSTRUCTOR:id:name:specialty -> Dozent erstellen, zur Sammlung hinzufügen, "Instructor added: [name]" ausgeben
// - ADD_STUDENT:id:name -> Student erstellen, zur Sammlung hinzufügen, "Student added: [name]" ausgeben
// - ADD_COURSE:courseId:title:instructorId -> Kurs mit Dozent erstellen, zur Sammlung hinzufügen, "Course added: [title]" ausgeben
// - ENROLL:studentId:courseId -> Student in Kurs einschreiben, "[studentName] enrolled in [courseTitle]" ausgeben
// - INFO:userId -> Benutzer finden (Student oder Dozent) und dessen toString() ausgeben
// TODO: Nach der Verarbeitung aller Befehle "--- Platform Summary ---" ausgeben
// TODO: Gib für jeden Kurs "[courseDetails] - [count] student(s)" aus
}
}
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 this-SchlüsselwortMethodenFelder (Attribute)Konstruktor-MethodeKonstruktor-ÜberladungRückblick – Einfacher Taschenrechner4Vererbung
Grundlagen der Vererbung (extends)Das super-SchlüsselwortMethoden überschreiben (@Override)Konstruktor-VerkettungDie Object-KlasseEinfache & mehrstufige VererbungWarum keine Mehrfachvererbung von KlassenZusammenfassung - Mitarbeiter-Hierarchie7Spezielle Methoden & Object-Klasse
toString()-Methodeequals() und hashCode()clone()-MethodecompareTo() und ComparableComparator-InterfaceZusammenfassung – Benutzerdefiniertes Sortieren2Zugriffsmodifikatoren & Kapselung
Überblick über ZugriffsebenenGetter- und Setter-MethodenInformation HidingDas final-SchlüsselwortRückblick – Bankkonto-Manager5Polymorphismus
Grundlagen der MethodenüberladungMethodenüberschreibung (Laufzeit)Upcasting und DowncastingDer instanceof-OperatorAbstrakte Klassen und MethodenZusammenfassung – Formenrechner8Fortgeschrittene OOP-Konzepte
Komposition vs. VererbungAggregation vs. KompositionInnere, geschachtelte & anonyme KlassenEnums und Enum-MethodenRecords (Java 16+)Sealed Classes (Java 17+)11Design Patterns Teil 1
Einführung in Design PatternsSingleton-PatternFactory-PatternBuilder-PatternObserver-PatternStrategy-Pattern14Abschlussherausforderungen
E-Learning-PlattformBanksystemSpielcharakter-EntwicklungFahrzeugvermietung3Klasseneigenschaften & Statische Member
Instanz- vs. statische VariablenStatische MethodenStatische BlöckeKonstanten (static final)Zusammenfassung – Zähler & Utility6Interfaces & Abstrakte Klassen
Einführung in InterfacesInterfaces implementierenImplementierung mehrerer InterfacesDefault- & statische Methoden in InterfacesAbstrakte Klassen vs. InterfacesFunktionale InterfacesZusammenfassung - Zahlungssystem