Урок № 19. Свойства (Properties). Часть 2
Свойства (Properties). Часть 2
Доброго времени суток! В этом уроке я расскажу, как еще можно использовать свойства (properties), например, как можно ограничивать доступ к полю класса используя свойство, или как не просто возвращать значение поля, а производить предварительные вычисления. Так же, я затрону работу со списками (списки для программиста, очень похожи на массивы, только имеют изменяемый размер). И так, к делу!
Действительно, если мы сделаем какое-то поле закрытым (private), то пользователь класса (программист, использующий объекты данного класса для собственных нужд) не сможет не изменять его значение напрямую, не получать уже установленное, для этого мы и создавали открытые (public) свойства в предыдущем уроке. Но мы делали свойства, способные и возвращать, и устанавливать значения… На практике же, бывает полезным создавать свойства, которые только возвращают значения, так называемые readonly свойства. И делается это очень просто. В таких свойствах есть только метод доступа get. Соответственно, пользователь класса просто не сможет присваивать значения, используя такое свойство.
Метод доступа set в свойствах «только для чтения» просто опускается…
Пример свойства «только для чтения»:
//Readonly свойство, для доступа к полую "grade" public uint Grade { //Возвращает значение get { return grade; } }
А теперь давайте поговорим о том, как можно использовать свойства в более сложных ситуация, нежели просто возврат значения какого-то поля. Представим такую ситуацию, что для «студентов» (которых описывает класс «Student») из прошлого урока нужно хранить список оценок, чтобы в любой момент можно было рассчитать средний бал студента. Для этой цели мы добавим список (List) как поле класса, и метод, который будет добавлять новую оценку в список, например, после каждого экзамена.
Код доработанного класса из предыдущего урока будет примерно таким:
//Класс, описывающий простого студента class Student { /* Метод, добавляющий очередную оценку в список * оценок "студента" */ public void AddResult(uint aResult) { results.Add(aResult); } //Свойство, для доступа к полую "name" public string Name { //Возвращает значение get { return name; } //Устанавливает значение set { name = value; } } //Свойство, для доступа к полую "grade" public uint Grade { //Возвращает значение get { return grade; } //Устанавливает значение set { grade = value; } } //Поля класса private string name; //Имя студента private uint grade; //Курс /* * Поле-список для хранения результатов экзаменов (оценок) * Использованы одновременное объявления и инициализация поля */ private List<uint> results = new List<uint>(); }
Обратите внимание на то, как работать со списками. Объявляется поле список следующим образом:
[модификатор доступа] List<[тип данных]> [название списка] = new List<[тип данных]>();Так создается новый, пустой список. А добавляются элементы в список через метод «Add»:
[название списка].Add([добавляемое значение]);
Создадим студента Петра, и добавим несколько оценок ему:
//Создадим студента Петра Student peterStudent = new Student(); //Настроим студента peterStudent.Name = "Пётр"; peterStudent.Grade = 2; //Добавим несколько оценок peterStudent.AddResult(5); peterStudent.AddResult(4); peterStudent.AddResult(3);
А теперь, создадим свойство, возвращающее средний бал Петра:
//Свойство, возвращающее средний бал public double Avarage { get { double sum = 0.0; for (int i = 0; i < results.Count; i++) { sum = sum + results[i]; } //Возвращаем результат return sum / results.Count; } }
Я думаю, алгоритм вычисления среднего значения объяснять не стоит, он и так прост. А вот на то что свойство содержит только метод доступа get стоит. Таким образом, мы рассмотрели еще один вариант использования свойств. В следующем уроке, поговорим о конструкторах. А пока весь код класса:
//Класс, описывающий простого студента class Student { /* Метод, добавляющий очередную оценку в список * оценок "студента" */ public void AddResult(uint aResult) { results.Add(aResult); } //Свойство, для доступа к полую "name" public string Name { //Возвращает значение get { return name; } //Устанавливает значение set { name = value; } } //Свойство, для доступа к полую "grade" public uint Grade { //Возвращает значение get { return grade; } //Устанавливает значение set { grade = value; } } //Свойство, возвращающее средний бал public double Avarage { get { double sum = 0.0; for (int i = 0; i < results.Count; i++) { sum = sum + results[i]; } //Возвращаем результат return sum / results.Count; } } //Поля класса private string name; //Имя студента private uint grade; //Курс /* * Поле-список для хранения результатов экзаменов (оценок) * Использованы одновременное объявления и инициализация поля */ private List<uint> results = new List<uint>(); }
В следующем уроке, поговорим про конструкторы и инициализацию объектов.