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

21 Авг 2019 в 07:06
210 +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 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир