Платформа онлайн-обучения
Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy — урок 84 из 87.
Добро пожаловать в главу «Финальные испытания»! Эти испытания призваны проверить ваше владение всеми концепциями ООП, которые вы изучили в ходе этого курса.
В этом испытании вы создадите систему платформы для электронного обучения, которая сочетает в себе наследование, интерфейсы, полиморфизм, инкапсуляцию и паттерны проектирования в едином приложении.
Ваша платформа должна моделировать отношения между курсами, студентами и преподавателями. Подумайте о том, как базовый класс User может быть расширен классами Student и Instructor, как курсы содержат уроки и как работает отслеживание записи на курсы между студентами и курсами.
Рассмотрите, какие принципы ООП применимы: используйте инкапсуляцию для защиты пользовательских данных, наследование для совместного использования общего поведения, интерфейсы для определения контрактов, таких как Enrollable или Completable, и полиморфизм для единообразной обработки различных типов пользователей.
Удачи в применении всего, чему вы научились!
Задание
ЛегкоДавайте создадим платформу электронного обучения (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:specialtyADD_STUDENT:id:nameADD_COURSE:courseId:title:instructorIdENROLL:studentId:courseIdINFO: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)"
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово thisМетодыПоля (атрибуты)Метод-конструкторПерегрузка конструкторовИтоги — Простой калькулятор4Наследование
Основы наследования (extends)Ключевое слово superПереопределение методов (@Override)Цепочка конструкторовКласс ObjectОдиночное и многоуровневое наследованиеПочему нет множественного наследования классовИтоги — Иерархия сотрудников7Специальные методы и класс Object
Метод toString()equals() и hashCode()Метод clone()compareTo() и ComparableИнтерфейс ComparatorПовторение — Кастомная сортировка2Модификаторы доступа и инкапсуляция
Обзор уровней доступаМетоды геттеры и сеттерыСокрытие данныхКлючевое слово finalИтоги — Менеджер банковского счета5Полиморфизм
Основы перегрузки методовПереопределение методов (Run-Time)Upcasting и DowncastingОператор instanceofАбстрактные классы и методыИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияАгрегация против композицииВнутренние, вложенные и анонимные классыEnums и методы перечисленийRecords (Java 16+)Sealed-классы (Java 17+)11Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн BuilderПаттерн ObserverПаттерн Strategy14Финальные испытания
Платформа онлайн-обученияБанковская системаРазработка игрового персонажаСервис аренды транспорта3Свойства класса и статические члены
Переменные экземпляра и статические переменныеСтатические методыСтатические блокиКонстанты (static final)Итоги: Счетчик и утилиты6Интерфейсы и абстрактные классы
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовDefault и Static методы в интерфейсахАбстрактные классы vs ИнтерфейсыФункциональные интерфейсыИтоги — Платежная система9Обобщения
Введение в обобщенияОбобщенные классыОбобщенные методыОграниченные параметры типаСимволы подстановки (Wildcards: ?, extends, super)Итоги — Обобщенный контейнер12Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»Паттерн «Итератор»