Урок по C# № 15 – «Члены (поля) класса»


В прошлом уроке мы с вами разобрали, что класс – это шаблон. А объект – это уже реализация данного шаблона. Также мы создали класс Human, на котором и будем изучать ООП.

Класс – это всего лишь каркас. И для нормального функционирования будущего объекта на его основе необходимо правильно продумать этот каркас.

Итак, у нас есть класс Human (человек). Что должен делать этот класс? Да практически все, что характерно живому человеку.

Человек обладает общими характеристиками типа веса, роста, телосложения, цвета волос, глаз, пола и т.д. Это и будут поля класса (часто вы можете также слышать термин члены класса). Я сознательно привел в качестве наглядного примера человека, чтобы вы изучали ООП сначала не на абстракции, как любят преподносить его некоторые авторы, а на вполне понятном примере. Тем не менее, нужно готовиться к тому, что часто классы будут как составлятся именно как некая абстрактная сущность, но об этом мы поговорим позже.

Итак, мы уже выбрали, какими характеристиками будет обладать наш объект класса Human. Давайте это будет вес, рост, пол, возраст и имя. Чтобы проще было вам читать, я буду давать имена в Unicode (т.е. они будут кириллическими). Вы же вольны поступать так, как вам угодно.

Итак, откройте ваш класс Human и добавьте в любое место после фигурных скобок наши характеристики. Я сделал это так:

class Human {
int вес;
int рост;
char пол;
int возраст;
string Имя;
}

Мы заполнили наш класс полями. Теперь можно создавать его экземляр. Кстати, я в этом коде нарочно сделал ошибку, которая помешает нам осуществить задуманное в дальнейшем. Если вы внимательно читали предыдущие два урока, то должны сами найти. Я объясню, где ошибка чуть дальше, но для вашего мозга будет полезнее сделать это самим.

Создадим экземпляр класса Human (по молчанию я подразумеваю, что вы создадите этот экземпляр в основной программе в методе Main ()):

Human человек1=new Human ();
человек1.имя= "Влад";

Если вас не смутил тот факт, что IDE не предложила варианты полей после точки, можете попробовать скомпилировать. Удивлены, что не получилось? Как вы думаете, почему так происходит?

А причина как раз в пресловутых модификаторах доступа. Как вы помните, их несколько, но самые распространенные это public и private. Так вот, в C# все члены и методы класса имеют тип по умолчанию как private (закрытый). Это означает, что ничто, даже экземпляр класса не сможет обратиться напрямую к закрытым членам. Это может только делать другие члены этого класса.

Что же нам делать, если нужно все же задать некоторые свойства? Наверняка вам придет в голову поменять модификатор на public. Что ж, давайте сделаем это:

class Human {
 public int вес;
public int рост;
public char пол;
 public int возраст;
public string Имя;
}

Теперь наш предыдущий код спокойно скомпилируется. Можете добавить все характеристики и посмотреть, что будет. Как вариант, добавьте строку вывода имени через Console.WriteLine ().

Кстати, обратите внимание, что C# на автомате все же присвоит всем переменным значение по умолчанию. Это сделано для того, чтобы не вызывать ошибок. Подробнее мы поговорим об этом, когда будем изучать Конструкторы и Деструкторы.

Вы можете создать несколько объектов и радоваться проделанной работе. Однако как вы думаете, зачем были введены модификаторы доступа?

Рассмотрим на примере. Допустим вы создаете объект, подразумевая реального спортсмена Бориса.  Допустим, вы хотите сделать его боксером-тяжеловесом и даете ему вес в 100 кг. Ваш объект задумывался как игровой персонаж  в боксе. Все вроде бы ничего, однако кто-то из ваших коллег-программистов решил дать этому боксеру вес в 70 кг. Как вы думаете, что будет с этим игровым персонажем, если его кинуть на ринг против 100 килограммового боксера?

Именно поэтому члены класса и закрывают по умолчанию. Запомните, поля должны иметь модификатор private.

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

<<Предыдущий урок                                                              Следующий урок>>

Рубрика: Уроки по C#

Комментарии

8 коммент. на “Урок по C# № 15 – «Члены (поля) класса»”
  1. Данила Коловрат:

    Честно говоря я не понял как из примера про боксера вытекает логика «Именно поэтому члены класса и закрывают по умолчанию. Запомните, поля должны иметь модификатор private.» — они закрываются чтобы их никто не мог ни прочитать ни изменить, а что тогда с ними делать ? и Второе: мы в классе писали public, а тут утверждается потом «Запомните, поля должны иметь модификатор private.»

  2. admin:

    Мы создали класс, где поля были закрытыми. Это так и должно быть. Однако их нужно изменить. Пример с боксером был мной приведен лишь для наглядности, почему не стоит использовать открытые поля.
    Поля должны быть private и баста. Для манипуляции с этими полями используются методы. Также у классов есть свойства, где можно манипулировать данными. Я просто привел пример, который на тот момент казался мне удачным.
    В любом случае, это тема следующего урока.

    • Данила Коловрат:

      1) т.е получается , что поля мы всегда как хорошие программисты задаем privat и через оператор «точка» их тогда не вызвать, но чтобы с ними оперировать мы должны использовать методы класса ?
      2) а в этой лекции мы использовали поля public просто потому , что у нас не было еще написано методов для манипулирования полями ?
      3) но вобще , если записать поля как паблик технически все скомпилируется успешно и будет работать даже и к ним технически тогда можно через точку обратиться, но так делать просто не нужно, потому что мы же хорошие программисты?
      4) а свойства мы наверно будет делать public ?

      • admin:

        :)
        Примерно так. Потерпите до следующего урока, там вы все поймете.
        Еще раз прочитайте об инкапсуляции.

  3. Erick:

    Помогите найти ошибку. Подчеркивает Void, args,Human и пишет «требуется класс, делегат итп»…

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace OOP
    {
    class Human {
    public int вес, возраст, рост;
    public string имя;
    public char пол;
    }
    static void Main (string[] args)
    {
    Human человек1 = new Human();
    человек1.имя = «Эрик»;
    Console.WriteLine(человек1.имя);
    }
    }

    • admin:

      Он и будет подчеркивать. Нет самого класса, из которого вызывается метод Main.
      Еще раз повторяю — программа на C#, равно как и на Java, состоит из одного или нескольких классов, один из которых должен обязательно содержать точку входа в программу в виде метода Main (на C#).
      В описанном коде класс Human стоит отдельно, и следом идет вызов Main. Чтобы компилятор не матерился, нужно остальной код обернуть в класс типа Program и т.д.

  4. Евгений:

    Вообще отлично все разжевано, прочитал у Шилдта про классы, остались пробелы, которые решил закрыть прочитав эти уроки. Читаю дальше, пока все очень доходчиво. Автору спасибо!

Добавить комментарий

Внимание! Не будут добавляться комментарии в виде откровенного спама или прямого анкора на свои сайты. Все спамеры будут передаваться в базу Akismet

Подтвердите, что Вы не бот — выберите человечка с поднятой рукой: