Урок № 17. Понятия класса и объекта


Классы и объекты. Поля и методы.

Доброго времени суток! Настало время поговорить о таких понятиях как класс и объект в контексте объектно-ориентированного программирования и языка C#. На самом деле, мы уже не раз сталкивались с классами и объектами, тот же метод «Main» (в котором мы пишем практически весь код) принадлежит классу «Program».

Можно сказать, что класс – это описание какого-то типа данных. Это некий абстрактный шаблон (набор правил), по которому мы можем создавать объекты (переменные, того типа данных, который описывает класс). Объект – это созданный экземпляр класса. Например, есть класс «Студент», который характеризует среднестатистического студента (с фамилией, именем, возрастом и т.п.), а есть конкретный студент Иванов Иван 20-ти лет. Вот в данном случае, Иванов Иван 20-ти лет как раз и является экземпляром класса! Т.е. конкретно существующей сущностью. Или другой пример, форма для выпечки хлеба является своего рода «классом», а выпеченные в ней булки хлеба – экземплярами. А теперь разберемся как создавать классы.

Хотя, на практике, Вам чаще придется работать с объектами классов, который создали не Вы (например, с объектами стандартных классов)…

И так, вот самый простой пример создания класса:

//Класс, описывающий простого студента
class Student
{
    //Тело класса
}

В данном примере создан самый простой класса с именем «Student», это вообще пустой класс, но даже такой класс может быть полезен на практике! Так по каким же правилам создаются классы? В самом простом случае указывается ключевое слово class после которого, через пробел, указывается название класса (в нашем случае «Student»). После названия класса, в фигурных скобках идет тело класса. А теперь давайте посмотрим, как можно создать объекты класса «Student»:

Student firstStudent = new Student();

Объекты классов, создаются почти так же, как и переменные стандартных типов, только после знака «=» мы используем ключевое слово new и дальше снова повторяем имя класса с круглыми скобками после него.

Очень похоже на вызов метода. Позже Вы поймете почему так!

Но на практике от такого «студента» толка будет мало, так как наш класс пустой… Так что, давайте заполним тело класса полезным содержимым! В этом уроке мы рассмотрим, как «заполнять» тело класса полями и методами.

Сначала разберемся с полями класса. Создаются они практически так же, как мы создавали переменные в методах, только есть одно отличие, перед полем класса желательно указать уровень доступа к нему. А указывается он с помощью одного из ключевых слов (модификаторов доступа), таких как public (доступ открыт) и private (доступ закрыт).

В C# есть еще и другие модификаторы доступа, но на данном этапе они нам пока не нужны.

Так вот, давайте заполним наш пустой класс несколькими полями, чтобы посмотреть на практике, как это делается:

//Класс, описывающий простого студента
class Student
{
    //Тело класса
    public string name; //Имя студента
    public uint grade;  //Курс
}

Выглядеть это может примерно так. В данном случае мы добавили два открытых поля (одно строковое, обозначающее имя, а второе целочисленное, неотрицательное, обозначающее курс). И с такими «студентами» уже можно работать. Давайте создадим студента Ивана, второго курса обучения:

//Создаем объект-студента (пока "безликого")
Student ivanStudent = new Student();

//Задаем значения полей объекта
ivanStudent.name = "Иван";  //Задаем имя
ivanStudent.grade = 2;      //Задаем курс

Всю работу мы сделали в два этапа, сначала создали «безликого» студента (создали новый объект класса), а потом задали значения полям объекта.

Обратите внимание как мы получаем доступ к полям объекта, сначала мы указываем имя объекта, а затем, через точку ­– имя поля. Обращение к методам и свойствам осуществляется так же.

В данном случае, мы можем устанавливать значения полям объекта что называется в лоб, т.е. напрямую обращаясь к ним после создания объекта. Такая возможность осталась у нас по тому, что при создании полей во время написания класса мы указали ключевое слово public перед каждым полем.

Но на практике так лучше не делать. Как правило, поля классов делают закрытыми, чтобы пользователь класса не мог работать с ними на прямую. Потому, что каждый объект – это сложная система, которая «живет» по своим правилам, и некорректное вмешательство из вне, может привести к нарушению целостности!

Если бы мы объявили поля класса закрытыми, т.е. вместо слова public написали слово private, то подобного рода код, просто не компилировался:

//Задаем значения полей объекта
ivanStudent.name = "Иван";  //Задаем имя
ivanStudent.grade = 2;      //Задаем курс

Но как же тогда работать с объектами, как задавать значения их полям, как получать эти значения? Вот тут нам и пригодятся методы! Общая практика предлагает делать поля класса закрытыми, а вот методы (а точнее часть методов) – открытыми, и уже с их помощью задавать и получать значения полей.

Внутри методов класса (как открытых, так и закрытых), можно получить доступ к любому, даже самому закрытому полю класса!

В чем преимущество данного подхода? Да в том, что класс пишете Вы, и Вы как его разработчик лучше всех знаете, что разрешить пользователю класса, а что запретить, и в соответствии с этим, разрабатываете открытые методы класса. А уже используя эти методы, пользователь класса и будет манипулировать объектами.

Так что, давайте изменим код класса, сделаем закрытыми его поля и создадим по два открытых метода, на каждое поле, один будет задавать значение полю, а второй – возвращать.

//Класс, описывающий простого студента
class Student
{
    //Возвращает значение поля name
    public string GetName() { return name; }
    //Возвращает значение поля grade
    public uint GetGrade() { return grade; }
    //Устанавливает значение поля name
    public void SetName(string aName)
    {
        name = aName;
    }
    //Устанавливает значение поля grade
    public void SetGrade(uint aGrade)
    {
        grade = aGrade;
    }

    //Тело класса
    private string name; //Имя студента
    private uint grade;  //Курс
}

Теперь, задать значения полям объекта можно только так:

//Создаем объект-студента (пока "безликого")
Student ivanStudent = new Student();

//Задаем значения полей объекта
ivanStudent.SetName("Иван");  //Задаем имя
ivanStudent.SetGrade(2);      //Задаем курс

На самом деле, в нашем случае, методы, устанавливающие значения полям, не особо отличаются функциональностью, но на практике, часто такие методы могут быть оснащены дополнительными проверками аргументов, например, методы могли бы не устанавливать слишком длинные имена, или курс старше шестого…

На сегодня, наверное, хватит информации. В этом уроке, мы обсудили понятия класса, объекта, полей и методов, а в следующем уроке мы поговорим про свойства в классах.

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