Menu
Coddy logo textTech

Платформа онлайн-обучения

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 84 из 87.

Добро пожаловать в главу «Финальные испытания»! Эти испытания призваны проверить ваше владение всеми концепциями ООП, которые вы изучили в ходе этого курса.

В этом испытании вы создадите систему платформы для электронного обучения, которая сочетает в себе наследование, интерфейсы, полиморфизм, инкапсуляцию и паттерны проектирования в едином приложении.

Ваша платформа должна моделировать отношения между курсами, студентами и преподавателями. Подумайте о том, как базовый класс User может быть расширен классами Student и Instructor, как курсы содержат уроки и как работает отслеживание записи на курсы между студентами и курсами.

Рассмотрите, какие принципы ООП применимы: используйте инкапсуляцию для защиты пользовательских данных, наследование для совместного использования общего поведения, интерфейсы для определения контрактов, таких как Enrollable или Completable, и полиморфизм для единообразной обработки различных типов пользователей.

Удачи в применении всего, чему вы научились!

challenge icon

Задание

Легко

Давайте создадим платформу электронного обучения (E-Learning Platform), которая объединит все концепции ООП, которые вы освоили в этом курсе! Вы создадите систему, моделирующую отношения между курсами, студентами и преподавателями, используя наследование, интерфейсы, полиморфизм и инкапсуляцию.

Вы организуете свой код в шести файлах:

  • Enrollable.java: Создайте интерфейс, который определяет контракт для операций зачисления. Он должен объявлять методы enroll(Student student), который возвращает boolean, и getEnrolledCount(), который возвращает int.
  • User.java: Создайте абстрактный базовый класс, представляющий любого пользователя на платформе. Включите приватные поля для id (String) и name (String), конструктор, который инициализирует оба поля, соответствующие геттеры и абстрактный метод getRole(), который возвращает String, описывающую роль пользователя.
  • Student.java: Создайте класс, который расширяет User. Добавьте приватный ArrayList для отслеживания ID курсов, на которые зачислен студент. Включите конструктор, вызывающий конструктор родителя, реализуйте getRole(), чтобы он возвращал "Student", и добавьте методы addCourse(String courseId) и getEnrolledCourseCount(). Переопределите toString(), чтобы он возвращал "Student: [name] ([enrolledCount] courses)".
  • Instructor.java: Создайте класс, который расширяет User. Добавьте приватное поле для specialty (String). Включите конструктор, принимающий id, name и specialty, реализуйте getRole(), чтобы он возвращал "Instructor", добавьте геттер для specialty и переопределите toString(), чтобы он возвращал "Instructor: [name] - [specialty]".
  • Course.java: Создайте класс, реализующий Enrollable. Включите приватные поля для courseId (String), title (String), instructor (Instructor) и ArrayList зачисленных студентов. Конструктор принимает courseId, title и instructor. Реализуйте enroll(Student student), чтобы добавить студента в список, вызвать метод студента addCourse() с ID этого курса и вернуть true. Реализуйте getEnrolledCount(). Добавьте метод getDetails(), который возвращает "[courseId] [title] by [instructorName]".
  • Main.java: Создайте свою платформу! Вы получите строку команд, разделенных запятыми:
    • ADD_INSTRUCTOR:id:name:specialty
    • ADD_STUDENT:id:name
    • ADD_COURSE:courseId:title:instructorId
    • ENROLL:studentId:courseId
    • INFO:userId

    Поддерживайте коллекции преподавателей, студентов и курсов. Обработайте каждую команду и выведите:

    • ADD_INSTRUCTOR: Instructor added: [name]
    • ADD_STUDENT: Student added: [name]
    • ADD_COURSE: Course added: [title]
    • ENROLL: [studentName] enrolled in [courseTitle]
    • INFO: Выведите результат метода toString() пользователя

    После всех команд выведите --- Platform Summary ---, а затем детали каждого курса и количество зачисленных студентов в формате [courseDetails] - [count] student(s).

Вы получите один входной параметр: строку команд, разделенных запятыми.

Например, при вводе 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, ваш вывод будет следующим:

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)

Эта задача объединяет наследование (иерархия User), интерфейсы (Enrollable), полиморфизм (разные типы пользователей со своими реализациями toString) и инкапсуляцию (приватные поля с контролируемым доступом) в единую систему!

Шпаргалка

Это финальное задание объединяет несколько концепций ООП в единую систему:

Интерфейсы

Определяйте контракты для поведения, которое должны реализовывать классы:

public interface Enrollable {
    boolean enroll(Student student);
    int getEnrolledCount();
}

Абстрактные классы

Создавайте базовые классы с общим поведением и абстрактными методами:

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();
}

Наследование

Расширяйте базовые классы для создания специализированных типов:

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";
    }
}

Реализация интерфейсов

Классы могут реализовывать интерфейсы для выполнения контрактов:

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();
    }
}

Полиморфизм

Различные классы могут переопределять методы для обеспечения специализированного поведения:

@Override
public String toString() {
    return "Student: " + name + " (" + enrolledCourses.size() + " courses)";
}

Инкапсуляция

Используйте приватные поля с контролируемым доступом через методы для защиты целостности данных и поддержания связей между объектами.

Попробуйте сами

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: Создайте коллекции для хранения инструкторов, студентов и курсов
        // Подсказка: Используйте HashMap с id в качестве ключа для удобного поиска
        
        // TODO: Разделите входную строку по запятой, чтобы получить отдельные команды
        
        // TODO: Обработайте каждую команду:
        // - ADD_INSTRUCTOR:id:name:specialty -> Создать инструктора, добавить в коллекцию, вывести "Instructor added: [name]"
        // - ADD_STUDENT:id:name -> Создать студента, добавить в коллекцию, вывести "Student added: [name]"
        // - ADD_COURSE:courseId:title:instructorId -> Создать курс с инструктором, добавить в коллекцию, вывести "Course added: [title]"
        // - ENROLL:studentId:courseId -> Записать студента на курс, вывести "[studentName] enrolled in [courseTitle]"
        // - INFO:userId -> Найти пользователя (студента или инструктора) и вывести результат его toString()
        
        // TODO: После обработки всех команд выведите "--- Platform Summary ---"
        
        // TODO: Для каждого курса выведите "[courseDetails] - [count] student(s)"
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование