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