ООП. Как правильно организовать связь классов? В общем есть три класса:Пространство имён ЕГЭ
{
Класс Образовательное_учреждение
{
Строка Название_ОУ;
Число Номер_ОУ;
Коллекция Ученики;
}
Класс Ученик
{
Строка Фамилия, Имя, Отчество;
Символ Пол;
Число Номер_паспорта;
Коллекция Предметы;
}
Класс предмет
{
Строка Название;
Дата Дата_сдачи;
Число Первичный_балл, Итоговый_балл;
}
}
Нужно продемонстрировать некоторые возможности ООП, а именно:Дружественные функции;Статичные методы;Конструкторы, деструкторы;Исключения;Интерфейсы;Шаблоны;Абстрактные классы и их абстрактные/виртуальные функции и их наследование;
Собственно возникает вопрос только по последнему пункту, где здесь более адекватно реализовать абстрактный класс с его методами? И чтобы он наследовался одним из наших классов? И конечно, чтобы осталось место для интерфейсов.
Данные классы не эталонные, можно свободно добавить новый класс и/или изменять поля этих классов. Реализация будет на C++, C#, Java, так что желательно исходить из их возможностей.

21 Авг 2019 в 07:06
175 +1
0
Ответы
1

В данной ситуации наиболее адекватным решением будет создание абстрактного класса "СубъектОбучения", который будет содержать абстрактные методы, связанные с обучением (например, "сдатьЭкзамен()" или "получитьСреднийБалл()").

Пример реализации на C++:

#include <iostream>
#include <string>
#include <vector>
class Предмет {
public:
std::string Название;
// Дополнительные поля предмета
Предмет(std::string название): Название(название) {}
};
class СубъектОбучения {
public:
virtual void сдатьЭкзамен() = 0;
virtual void получитьСреднийБалл() = 0;
// Другие абстрактные методы
virtual ~СубъектОбучения() {}
};
class Ученик : public СубъектОбучения {
public:
std::string Фамилия, Имя, Отчество;
char Пол;
int Номер_паспорта;
std::vector<Предмет> Предметы;
Ученик(std::string фамилия, std::string имя, std::string отчество, char пол, int номер_паспорта): Фамилия(фамилия), Имя(имя), Отчество(отчество), Пол(пол), Номер_паспорта(номер_паспорта) {}
void сдатьЭкзамен() override {
// Реализация метода
}
void получитьСреднийБалл() override {
// Реализация метода
}
};
class Образовательное_учреждение {
public:
std::string Название_ОУ;
int Номер_ОУ;
std::vector<Ученик> Ученики;
Образовательное_учреждение(std::string название, int номер_оу): Название_ОУ(название), Номер_ОУ(номер_оу) {}
};
int main() {
// Пример использования классов
Ученик ученик("Иванов", "Иван", "Иванович", 'М', 123456);
Образовательное_учреждение учреждение("Школа №1", 1);
учреждение.Ученики.push_back(ученик);
return 0;
}

Таким образом, абстрактный класс "СубъектОбучения" содержит методы, которые относятся к обучению, и его методы реализуются в классе "Ученик". Класс "Ученик" в данном случае наследует абстрактный класс и реализует его методы.

Интерфейсы могут быть также добавлены по аналогии с абстрактными классами, но в данном примере для наглядности использован только абстрактный класс.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 727 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир