Menu
Coddy logo textTech

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!

challenge icon

Aufgabe

Einfach

Lassen 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 Methoden enroll(Student student), die einen boolean zurückgibt, und getEnrolledCount(), 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ür id (String) und name (String) hinzu, einen Konstruktor, der beide initialisiert, entsprechende Getter und eine abstrakte Methode getRole(), die einen String zurückgibt, der die Rolle des Benutzers beschreibt.
  • Student.java: Erstellen Sie eine Klasse, die User erweitert. 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 Sie getRole() so, dass "Student" zurückgegeben wird, und fügen Sie die Methoden addCourse(String courseId) und getEnrolledCourseCount() hinzu. Überschreiben Sie toString(), um "Student: [name] ([enrolledCount] courses)" zurückzugeben.
  • Instructor.java: Erstellen Sie eine Klasse, die User erweitert. Fügen Sie ein privates Feld für specialty (String) hinzu. Fügen Sie einen Konstruktor hinzu, der id, name und specialty entgegennimmt, implementieren Sie getRole() so, dass "Instructor" zurückgegeben wird, fügen Sie einen Getter für specialty hinzu und überschreiben Sie toString(), um "Instructor: [name] - [specialty]" zurückzugeben.
  • Course.java: Erstellen Sie eine Klasse, die Enrollable implementiert. Fügen Sie private Felder für courseId (String), title (String), instructor (Instructor) und eine ArrayList mit eingeschriebenen Studenten hinzu. Der Konstruktor nimmt courseId, title und instructor entgegen. Implementieren Sie enroll(Student student), um den Studenten zur Liste hinzuzufügen, rufen Sie die Methode addCourse() des Studenten mit der ID dieses Kurses auf und geben Sie true zurück. Implementieren Sie getEnrolledCount(). Fügen Sie eine Methode getDetails() 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:specialty
    • ADD_STUDENT:id:name
    • ADD_COURSE:courseId:title:instructorId
    • ENROLL:studentId:courseId
    • INFO: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
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung