Объектно-ориентированное программирование

общую информацию о людях, занимающихся разведением цветов, и ожидаю, что Фло, будучи представителем этой категории, в общих чертах будет соответствовать шаблону. Мы можем использовать терминFlorist для описания категории(иликласса) всех людей, занимающихся цветоводством, собрав в нее(категорию) все то общее, что им свойственно. Эта операция является вторым принципом объектно-ориентированного программирования:

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

Проблема сообщества  объектно-ориентированных программистов заключается в распространенности различных терминов для обозначения сходных идей. Так, в языке Object Pascal класс называется «объектом» (тип данных object), а надклассы(которые вкратце будут описаны ниже) известны как родительский класс, класс-предок и т. д. Словарь-глоссарий в конце этой книги поможет вам разобраться с нестандартными терминами. Мы будем использовать соглашение, общее для объектно-ориентированных языков программирования: всегда обозначать классы идентификаторами, начинающимися с заглавной буквы. Несмотря на свою распространенность, данное соглашение не является обязательным для большинства языков программирования.

1.4.4. Иерархии классов и наследование

О Фло у меня имеется больше информации, чем содержится в категории Florist. Я знаю, что она разбирается в цветах и является владелицей магазина(shopkeeper). Я догадываюсь, что, вероятно, меня спросят о деньгах в процессе обработки моего запроса и что после оплаты мне будет выдана квитанция. Все вышеперечисленное справедливо также для зеленщиков, киоскеров, продавцов магазинов и т. д. Поскольку категория Florist является более узкой, чем Shopkeeper, то любое знание, которым я обладаю о категории Shopkeeper, справедливо также и для Florist, и, в частности, для Фло.

Один из способов представить организацию моего знания о Фло — это иерархия категорий(рис. 1.1). Фло принадлежит к категории Florist; Florist является подкатегорией категории Shopkeeper. Далее, представитель Shopkeeper заведомо является человеком, то есть принадлежит к категории Human — тем самым я знаю, что Фло с большой вероятностью является двуногим существом. Далее, категория Human включена в категорию млекопитающих(Mammal), которые кормят своих детенышей молоком, а млекопитающие являются подкатегорией животных(Animal) и, следовательно, дышат кислородом. В свою очередь животные являются материальными объектами дуумов с различными линиями наследования. Классы представляются в виде иерархической древовидной структуры, в которой более абстрактные классы(такие, как Material Object или Animal) располагаются в корне дерева, а более специализированные классы и в конечном итоге индивидуумы располагаются на его конце, в ветвях. Рисунок1.2 показывает такую иерархию классов для Фло. Эта же самая иерархия включает в себя мою жену Бет, собаку Флеш, Фила— утконоса, живущего в зоопарке, а также цветы, которые я послал своей бабушке.

 

 

Рис. 1.2. Иерархическое дерево классов, представляющих различные материальные

объекты

Поскольку Фло — человек, та информация о ней, которой я обладаю, применима также, к примеру, к моей жене Бет. Те данные, которыми я располагаю в силу принадлежности последней к классу млекопитающих, имеют также отношение к моей собаке Флеш. Информация об объектах как о вещах материальных имеет смысл в отношении Фло, и ее цветов. Мы выражаем все это в виде идеи наследования:

Классы могут быть организованы в иерархическую структуру с наследованием свойств. Дочерний класс (или подкласс) наследует атрибуты родительского класса(или надкласса), расположенного выше в иерархическом дереве1 . Абстрактный родительский класс — это класс, не имеющий экземпляров(его примером может служить Mammal на рис. 1.2). Он используется только для порождения подклассов.

1.4.5. Связывание и переопределение методов

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

Мы сделаем это, допустив правило, что информация, содержащаяся в подклассе, может-

1 Здесь придется попросить читателя вернуться к рис. 1.2 и обратить внимание на то, что согласно принятой схеме дерево растет сверху вниз. — Примеч. ред.