Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
130273_03FB1_shpory_po_obektno_orientirovannomu....doc
Скачиваний:
45
Добавлен:
24.12.2018
Размер:
650.24 Кб
Скачать
  1. Объект, класс. Понятие, примеры

Понятие класса

Что такое класс проще всего объяснить на примерах. Представьте, что вас спрашивают "что такое яблоко?". Скорее всего, вы ответите что-то вроде: "яблоки, это вкусные плоды, растущие на деревьях — яблонях; они бывают разных цветов и размеров". Заметьте, что когда мы описываем яблоки как понятие, мы не имеем в виду некоторый конкретный объект, а скорее описываем наше обобщенное представление о них. Если же вас попросят описать совершенно конкретное яблоко, лежащее на блюдечке перед вами, вы будете говорить о нем по другому: "это яблоко, оно красное, сочное, судя по всему спелое. С черенком, на котором остался листик, и маленькой червоточинкой".

Разница заключается в том, что когда вы говорили о яблоках, вы описывали свое представление яблок, как класса объектов. Когда вы описывали яблоко, то вы имели в виду конкретный экземпляр, или объект. Говоря о классе, вы можете описать только те свойства, что принадлежат всем яблокам; когда же вы описываете объект, то в первую очередь имеете в виду его индивидуальные особенности (свойства). Тем не менее, описание объекта начинается с упоминания его класса ("это яблоко,..."), а затем уже свойств объекта (ведь "сочным и спелым" может быть и апельсин). Это важная особенность объектно-ориентированного подхода.

Таким образом, понятия классов и объектов это не математическая абстракция, а скорее часть нашего восприятия мира, того как мы мыслим.

Из примеров выше мы смогли уяснить следующее:

Классы, это некоторые абстрактные сущности, задающие общие черты своих объектов

Все объекты одного класса похожи друг на друга, но имеют некоторые индивидуальные особенности

Классы могут наследоваться, расширяя набор свойств класса родителя своими собственными

Перейдем теперь ближе к основной теме нашего повествования, а именно языку К++:

С точки зрения языка, класс представляет собой набор следующих элементов:

полей, т.е. переменных, хранящих индивидуальные особенности объектов,

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

свойств, определяющих взаимодействие других объектов с объектами данного класса.

Поля — это переменные, которые относятся к некоторому конкретному экземпляру нашего класса. Каждый экземпляр имеет свою копию набора переменных, таким образом, они могут хранить свое состояние (например, показатель "спелости", в примере с яблоками). Эти переменные доступны только самому классу, доступ извне для них запрещен. Для того чтобы частично разрешить этот доступ, применяются свойства. Сами свойства будут описаны позже, здесь стоит отметить только то, что свойство может быть доступно "только на чтение", "только на запись" или "и на чтение и на запись". Свойство может быть связано либо с некоторым полем, либо с методом. Например, если свойство доступно "только на чтение" то его можно использовать для получения значения, но не для его записи (то есть, такое свойство не может фигурировать в качестве lvalue).

Методы — это тот самый, связанный с данными код (вспомните историю ООП) который, естественно, может работать с переменными объекта (то есть с полями) и служит для описания поведения данного класса объектов.

Класс может иметь одного или нескольких родителей (опять же, подробнее об этом см. ниже)

Методы и свойства класса могут находиться в различных областях видимости. Это обеспечивается с помощью спецификаторов доступа:

private — Частная собственность! Видимость только внутри методов данного класса

protected — "Семейная реликвия", доступ внутри методов данного класса и всех его дочерних классов

public — видимость и доступ для всех

Примечание: По умолчанию методы имеют видимость private, в то время как свойства — public.

Приведем, наконец, пример объявления класса:

1class MyWeirdClass {

2 var m_x = 0; // поле m_x, изначально проинициализированное нулем

3 const m_y = 1; // поле-константа m_y

4

5 // методы класса

6 public const function int get_mul() { return m_x * m_y; }

7 public function void set_mul(int x) { m_x = x / m_y; }

8

9 // свойство класса

10 public property mul read get_mul write set_mul;

11}

1

Как у любого нормального разумного существа, у класса есть "голова" и "тело". Ключевое слово class начинает объявление класса. Далее за ним следует идентификатор имени класса, после чего идет тело класса.

3-4

Здесь мы видим объявление двух полей класса — переменной m_x и константы m_y, которые, подобно обычным переменным инициализируются тут же, на месте объявления (камень в огород C++). Зачем нужны поля-константы, описано в главе Константы.

7-8

Для доступа к состоянию объекта, определены два метода: аксессор get_mul() и мутатор set_mul(). Подобные конструкции применяются настолько часто, что им были даны специальные имена. Как видно из названия, первый метод дает доступ к значению, второй изменяет или мутирует его.

11

Завершается объявление класса объявлением свойства mul, которое связывается с аксессором и мутатором. Думаю, читатель уже догадался, что это свойство типа "чтение и запись". Таким образом, при обращении к свойству на чтение, будет вызван аксессор, а результат его выполнения будет возвращен в качестве значения свойства. И, наоборот, при попытке записать в свойство некоторое значение, будет вызван мутатор, в качестве аргумента которому будет передано это самое значение, а уж сам мутатор позаботится о том, чтобы оно было "доставлено по адресу".

Примечание: Зачем нужны такие сложности, и зачем дублировать вроде бы одинаковый функционал, будет описано ниже.

Понятие объекта

Собственно, понятие объекта уже много раз было затронуто выше по повествованию. Поэтому здесь приведем лишь небольшое определение: Под объектом подразумевается экземпляр того или иного класса, т.е. некоторая сущность, поведение которой задается соответствующим классом.

Для создания объекта того или иного класса служит оператор new:

var myWeirdObject = new MyWeirdClass;

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]