Итоги — Записи студентов
Часть раздела Объектно-ориентированное программирование путешествия по C# на Coddy — урок 35 из 70.
Задание
ЛегкоДавайте создадим систему учета студентов, которая объединит все техники инкапсуляции, изученные вами в этой главе. Вы создадите безопасную систему, в которой данные студентов надежно защищены, оценки проходят валидацию, а определенная информация остается неизменной после создания.
Вы организуете свой код в двух файлах:
Student.cs: Создайте классStudentв пространстве именRecords, который демонстрирует правильную инкапсуляцию. У вашего студента должны быть:- Поле
readonlyс именемName(string), которое общедоступно, но может быть установлено только во время создания объекта. - Приватное поле
readonlyдля идентификатора студента (string) — оно никогда не должно быть доступно напрямую извне. - Приватный список для хранения оценок (целых чисел).
- Публичное свойство только для чтения
Average, которое вычисляет и возвращает среднее значение всех оценок или0, если оценок нет. - Публичный метод
AddGrade(int grade), который принимает только оценки от 0 до 100 (включительно) — некорректные оценки должны молча игнорироваться. - Публичный метод
GetGradeCount(), который возвращает количество записанных валидных оценок. - Публичный метод
GetStudentInfo(), который возвращает строку в формате"{Name} (ID: {last 4 characters of student ID})"— обратите внимание, что вы предоставляете только маскированную версию ID!
- Поле
Program.cs: В основном файле создайте объект студента и добавьте несколько оценок, чтобы продемонстрировать работу инкапсуляции. Вы покажете, что валидные оценки принимаются, некорректные — отклоняются, а средний балл рассчитывается правильно.
Вы получите пять входных данных:
- Имя студента
- ID студента (минимум 4 символа)
- Первая оценка для добавления (целое число)
- Вторая оценка для добавления (целое число, может быть некорректным, например -5 или 150)
- Третья оценка для добавления (целое число)
Выведите результат в следующем формате:
{GetStudentInfo() result}
Grades recorded: {GetGradeCount()}
Average: {Average}Например, если входные данные: Emma Wilson, STU12345, 85, 150 и 90, вывод должен быть:
Emma Wilson (ID: 2345)
Grades recorded: 2
Average: 87.5Обратите внимание, что некорректная оценка 150 была молча отклонена, поэтому было записано только две оценки. ID студента защищен — внешний код никогда не увидит полный ID, только маскированную версию через GetStudentInfo(). Имя доступно для чтения, но неизменяемо. Это и есть совместная работа механизмов инкапсуляции для создания надежного, хорошо защищенного класса!
Попробуйте сами
using System;
using Records;
class Program
{
public static void Main(string[] args)
{
// Чтение входных данных
string name = Console.ReadLine();
string studentId = Console.ReadLine();
int grade1 = Convert.ToInt32(Console.ReadLine());
int grade2 = Convert.ToInt32(Console.ReadLine());
int grade3 = Convert.ToInt32(Console.ReadLine());
// TODO: Создайте объект Student с name и studentId
// TODO: Добавьте все три оценки, используя метод AddGrade
// TODO: Выведите результат в требуемом формате:
// {результат GetStudentInfo()}
// Записано оценок: {GetGradeCount()}
// Средний балл: {Average}
}
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыПространства имен и директивыВведение в классы и объектыКлючевое слово 'this'Методы и параметрыПоля и свойстваКонструкторыИнициализаторы объектовИтоги — Простой калькулятор4Наследование
Основы синтаксиса наследования (:)Ключевое слово 'base'Ключевые слова Virtual и OverrideЗапечатанные классыБазовый класс 'object'Итоги — Иерархия сотрудников7Продвинутые возможности
Перегрузка операторовИндексаторы (this[])Переопределение ToString()Методы расширенияПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПотокобезопасный SingletonПаттерн FactoryПаттерн Observer (События)Паттерн Strategy13Финальные испытания
Платформа для онлайн-обученияКомпонент игрового персонажаСервис аренды транспорта2Свойства и статические члены
Автоматически реализуемые свойстваСвойства только для чтения и записиСтатические поля и методыСтатические классыЧлены в виде выражений5Полиморфизм и интерфейсы
Полиморфизм: компиляция vs выполнениеИнтерфейс vs абстрактный классМножественные интерфейсыЯвные интерфейсыUpcasting и DowncastingИтоги: Калькулятор фигур8Продвинутые концепции ООП
Композиция вместо наследованияGenerics (классы и методы)Делегаты и событияАтрибуты и рефлексияIDisposable и оператор usingОсновы Dependency Injection11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Архитектура классов
Экземплярные и статические данныеКлючевые слова 'readonly' и 'const'Опорные поляПовторение — Менеджер банковских счетов6Инкапсуляция
Модификаторы доступаСвойства для инкапсуляцииРеализация скрытия данныхПаттерны неизменяемостиИтоги — Записи студентов9Переменное количество аргументов
Ключевое слово 'params'Необязательные параметрыИменованные аргументыПерегрузка методов