Бертран Мейер - Основы объектно-ориентированного программирования
- Название:Основы объектно-ориентированного программирования
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Бертран Мейер - Основы объектно-ориентированного программирования краткое содержание
Фундаментальный учебник по основам объектно-ориентированного программирования и инженерии программ. В книге подробно излагаются основные понятия объектной технологии – классы, объекты, управление памятью, типизация, наследование, универсализация. Большое внимание уделяется проектированию по контракту и обработке исключений, как механизмам, обеспечивающим корректность и устойчивость программных систем.
В книге Бертрана Мейера рассматриваются основы объектно-ориентированного программирования. Изложение начинается с рассмотрения критериев качества программных систем и обоснования того, как объектная технология разработки может обеспечить требуемое качество. Основные понятия объектной технологии и соответствующая нотация появляются как результат тщательного анализа и обсуждений. Подробно рассматривается понятие класса - центральное понятие объектной технологии. Рассматривается абстрактный тип данных, лежащий в основе класса, совмещение классом роли типа данных и модуля и другие аспекты построения класса. Столь же подробно рассматриваются объекты и проблемы управления памятью. Большая часть книги уделена отношениям между классами – наследованию, универсализации и их роли в построении программных систем. Важную часть книги составляет введение понятия контракта, описание технологии проектирования по контракту, как механизма, обеспечивающего корректность создаваемых программ. Не обойдены вниманием и другие важные темы объектного программирования – скрытие информации, статическая типизация, динамическое связывание и обработка исключений. Глубина охвата рассматриваемых тем делает книгу Бертрана Мейера незаменимой для понимания основ объектного программирования.
Основы объектно-ориентированного программирования - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
(отличающийся от наследуемых компонентов родителей) ...
end
Родителей класса достаточно перечислить в предложении inherit. (Как обычно, можно разделять их имена точкой с запятой, хотя это не обязательно.) Порядок перечисления классов не играет никакой роли.
В моделировании систем найдется еще немало примеров, подобных COMPANY_PLANE .
[x].Наручные часы-калькулятор моделируются с применением множественного наследования. Один родитель позволяет устанавливать время и отвечать на такие запросы, как текущее время и текущая дата. Другой - электронный калькулятор - поддерживает арифметические операции.
[x].Наследником классов судно и грузовик является амфибия ( AMPHIBIOUS_VEHICLE ). Наследник классов: судно, самолет - гидросамолет ( HYDROPLANE ). (Как и с TEACHING_ASSISTANT , здесь также возможно дублируемое наследование, поскольку каждый из классов-родителей является потомком средства передвижения VEHICLE .)
[x].Ужин в ресторане; поездка в вагоне поезда - вагон-ресторан ( EATING_CAR ). Вариант: спальный вагон ( SLEEPING_CAR ).
[x].Диван-кровать ( SOFA_BED ), на котором можно не только читать, но и спать.
[x]."Дом на колесах" ( MOBILE_HOME ) - вид транспорта ( VEHICLE ) и жилище ( HOUSE ) одновременно; и так далее.
С точки зрения программиста эти примеры представляют академический интерес - нам платят за построение систем, а не за построение модели мира. Впрочем, во многих практических приложениях с аналогичными комбинациями абстрактных понятий вы обязательно столкнетесь. Более подробный пример из графической среды разработки ISE мы изложим чуть ниже.
Числовые и сравнимые значения
Следующий пример напрямую относится к повседневной практике ОО-разработки и неразрывно связан с построением библиотеки Kernel.
Ряд классов Kernel, потенциально необходимых всем приложениям, требуют поддержки таких операций арифметики, как infix "+", infix "-", infix "*", prefix "-", а также специальных значений zero (единичный элемент группы с операцией " + ") и one (единичный элемент группы с операцией " * "). Эти компоненты используют отдельные классы библиотеки Kernel: INTEGER , REAL и DOUBLE . Впрочем, они нужны и другим, заранее не определенным классам, например, классу MATRIX , который описывает матрицы определенного вида. Приведенные абстракции уместно объединить в отложенном классе NUMERIC , являющемся частью библиотеки Kernel:
deferred class NUMERIC feature
... infix "+", infix "-", infix "*", prefix "-", zero, one...
end
NUMERIC имеет строгое математическое определение. Его экземпляры служат для представления элементов кольца (множества с двумя операциями, каждая из которых индуцирует на нем группу, причем одна из операций коммутативна, а вторая дистрибутивна относительно первой).
Многим классам необходимо отношение порядка с операциями сравнения элементов. Такая возможность полезна для классов Kernel, таких как STRING, и для многих других классов. Поэтому в состав библиотеки входит отложенный класс COMPARABLE:
deferred class COMPARABLE feature
... infix "<", infix "<=", infix ">", infix ">="...
end
Математически его экземпляры - это полностью упорядоченные множества с заданным отношением порядком.
Не все потомки COMPARABLE должны быть потомками NUMERIC . В классе STRING арифметика не нужна, однако нужен порядок. Обратно, не все потомки NUMERIC должны быть потомками COMPARABLE . Так, на множестве матриц с действительными коэффициентами есть сложение, умножение, единица, нуль, что придает ей свойства кольца, но нет отношения порядка. Поэтому COMPARABLE и NUMERIC должны оставаться различными классами, и ни один из них не должен быть потомком другого.
Объекты некоторых типов, однако, имеют числовую природу и одновременно допускают сравнение. (Такие классы моделируют вполне упорядоченные кольца.) Примеры таких классов - REAL и INTEGER . Целые и действительные числа сравнивают, складывают и умножают. Их описание можно построить на множественном наследовании:
expanded class REAL inherit
NUMERIC
COMPARABLE
feature
...
end
Рис. 15.4. Структура множественного и единичного наследования
Окна - это деревья и прямоугольники
Рассмотрим оконную систему с произвольной глубиной вложения окон:
Рис. 15.5. Окна и подокна
В соответствующем классе WINDOW мы найдем компоненты двух основных видов:
[x].те, что рассматривают окно как иерархическую структуру (список подокон, родительское окно, число подокон, добавить, удалить подокно);
[x].те, что рассматривают окно как графический объект (высота, ширина, отобразить, спрятать, переместить окно).
Этот класс можно написать как единое целое, смешав все компоненты. Однако такой проект будет не самым удачным. Класс WINDOW следует рассматривать как сочетание двух абстракций:
[x].иерархической структуры, представленной классом TREE ;
[x].прямоугольного экранного объекта, представленного классом RECTANGLE .
На практике класс будет описан так:
class WINDOW inherit
TREE [WINDOW]
RECTANGLE
feature
... Характерные компоненты окна ...
end
Обратите внимание, класс TREE является родовым (generic) классом, а потому требует указания фактического родового параметра, здесь - самого класса WINDOW . Рекурсивная природа определения отражает рекурсию, присущую моделируемой ситуации, - окно является одновременно деревом окон.
Далее, можно подметить, что отдельные окна не содержат ничего, кроме текста. Эту особенность окон можно реализовать вложением, представив класс TEXT_WINDOW как клиента класса STRING , введяатрибут
text: STRING
Предпочтем, однако, вариант, в котором текстовое окно являетсяодновременно строкой. В этом случае используем множественное наследование с родителями WINDOW и STRING . (Если же все наши окна содержат лишь текст, их можно сделать прямыми потомками TREE , RECTANGLE и STRING , однако и здесь решение "в два хода" возможно будет более предпочтительным.)
Деревья - это списки и их элементы
Класс дерева TREE - еще один яркий пример множественного наследования.
Читать дальшеИнтервал:
Закладка: