Шаг 79.
Язык программирования C#. Начала
Знакомство с классами и объектами. Классы и объекты

    На этом шаге мы рассмотрим (в общем случае) эти понятия.

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


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

    Так вот, чертеж или план, на котором изображен автомобиль со всеми его техническими характеристиками, - это аналог класса. А реальные автомобили, которые выходят с конвейера и которые собраны в соответствии с чертежом, - аналог объектов. Все автомобили (если они собраны по одному и тому же чертежу) - однотипные. У них одинаковый набор характеристик, и в плане функциональности они эквивалентны. Но физически автомобили различны, у каждого своя "судьба".


У автомобилей, собранных по одному чертежу, одинаковый набор характеристик, но значения некоторых характеристик могут отличаться. Например, у каждого автомобиля есть такая характеристика, как цвет. Но значение этой характеристики у разных автомобилей может быть разным: скажем, один автомобиль красный, а другой - синий.

    Если обратиться к примеру с постройкой дома, то там аналогом объектов являются блоки, из которых строится дом. Базовый чертеж, на основе которого на заводе изготовлялся блок, является аналогом класса. Допустим, дом строится с использованием блоков пяти разных типов. Это означает, что имеется пять разных чертежей блоков, на основании которых создаются блоки. Если блоки создавались на основе разных чертежей, то они будут разными. Если блоки создавались на основе одного и того же чертежа, то они будут одинаковыми (точнее, однотипными).


В известном смысле, класс можно рассматривать как некий тип данных. Но только это специфический тип, поскольку кроме собственно данных в нем "спрятана" еще и некоторая функциональность (способность выполнять определенные действия).

    Наличие чертежа не означает наличия блока. Блоки нужно создавать. На основании одного чертежа можно создать много блоков. Но также может быть и ситуация, когда чертеж есть, а блоки по нему не создавались. Это же справедливо для классов и объектов. Класс нужен для создания на его основе объектов. На основе одного класса можно создать много объектов. А можно описать класс и не создавать объектов совсем. Все зависит от решаемой задачи.

    Аналогии - это хорошо. Но что же такое объект, если речь идет об использовании его в программе? Скажем, мы уже знаем, что за переменной "скрывается" область в памяти. В эту область можно записывать значения и считывать значение оттуда. И для получения доступа к этой памяти достаточно знать имя переменной. Объект во многом похож на переменную, но только он более "разноплановый". Объект - это группа переменных, причем в общем случае разного типа. А еще объект - это набор методов. Метод, в свою очередь - это группа инструкций, которые можно выполнить (вызвав метод).


Здесь и далее, если явно не указано противное, имеются в виду обычные, не статические методы. Обычный метод, в отличие от статического, "привязан" к объекту и не может быть вызван, если не указан объект, из которого вызывается метод.

    В итоге получается, что если обычная переменная напоминает коробку со значением внутри, то объект - это большая коробка, в которой есть коробки поменьше (переменные) и всякие пружинки и рычажки (наборы инструкций, реализованные в виде методов). С программной точки зрения объект реализуется как некоторая область памяти, содержащая переменные и методы.


Откровенно говоря, в памяти коды методов для объектов обычно хранятся отдельно от переменных, входящих в объект. Связано это с оптимизацией. Но для понимания принципов работы объектов и использования их в программе можно полагать, что и переменные, и методы объекта находятся в "одной коробке".

    Программная "начинка" объекта состоит из переменных и методов. Переменные называются полями объекта. Объекты, как мы помним, создаются на основе класса. Когда мы описываем класс, мы фактически определяем, какие поля и методы будут у объектов, создаваемых на основе класса.

    Поля метода можно использовать как обычные переменные. Методы объекта можно вызывать. В этом случае выполняются инструкции, содержащиеся в теле метода. Метод, который вызывается из некоторого объекта, автоматически получает доступ к полям (и другим методам) этого объекта. Также важно помнить, что и поля, и методы у каждого объекта свои. Точно так же, как у каждого автомобиля свой руль, свои колеса и своя коробка передач. И если вы поворачивает ключ зажигания, то заведется тот автомобиль, в котором вы поворачиваете ключ. А если вы перекрасите свой автомобиль, то это никак не скажется на цвете автомобиля вашего соседа (даже если у него автомобиль той же марки).

    На следующем шаге мы рассмотрим описание класса и создание объекта.




Предыдущий шаг Содержание Следующий шаг