Урок № 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>();
    }

В следующем уроке, поговорим про конструкторы и инициализацию объектов.

Перейти к следующему уроку