Menu
Coddy logo textTech

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

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

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

В этом задании ты создашь систему E-Learning Platform, которая объединяет наследование, интерфейсы, полиморфизм, инкапсуляцию и шаблоны проектирования в единое приложение.

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

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

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

challenge icon

Задание

Легко

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

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

  • Enrollable.java: создайте интерфейс, определяющий contract для операций записи на курс. Он должен Declare методы enroll(Student student), возвращающий boolean, и getEnrolledCount(), возвращающий int.
  • User.java: создайте абстрактный базовый class, представляющий любого пользователя платформы. Добавьте private-поля id (String) и name (String), constructor, инициализирующий оба поля, соответствующие getter-методы и абстрактный метод getRole(), возвращающий String с описанием роли пользователя.
  • Student.java: создайте class, расширяющий User. Добавьте private ArrayList для отслеживания ID курсов, на которые записан студент. Включите constructor, вызывающий родительский constructor, реализуйте getRole() с возвратом "Student" и добавьте методы addCourse(String courseId) и getEnrolledCourseCount(). Переопределите toString(), чтобы он возвращал "Student: [name] ([enrolledCount] courses)".
  • Instructor.java: создайте class, расширяющий User. Добавьте private-поле specialty (String). Включите constructor, принимающий id, name и specialty, реализуйте getRole() с возвратом "Instructor", добавьте getter для specialty и переопределите toString(), чтобы он возвращал "Instructor: [name] - [specialty]".
  • Course.java: создайте class, реализующий Enrollable. Добавьте private-поля courseId (String), title (String), instructor (Instructor) и ArrayList записанных студентов. Constructor принимает courseId, title и instructor. Реализуйте enroll(Student student), чтобы добавить студента в список, вызвать метод студента addCourse() с ID этого курса и вернуть true. Реализуйте getEnrolledCount(). Добавьте метод getDetails(), возвращающий ID курса в квадратных скобках, затем title и имя instructor, сформированные как "[" + 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

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

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

    After всех команд выведите --- 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) и инкапсуляцию (private-поля с контролируемым доступом) в единую систему!

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

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: Разделите input по запятой, чтобы получить отдельные команды
        
        // TODO: Обработайте каждую команду:
        // - 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 -> Зачислите студента на курс, выведите "[studentName] enrolled in [courseTitle]"
        // - INFO:userId -> Найдите пользователя (студента или преподавателя) и выведите их toString()
        
        // TODO: After processing all commands, print "--- Platform Summary ---"
        
        // TODO: Для каждого курса выведите "[courseDetails] - [count] student(s)"
    }
}
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Java