- •Введение
- •Как получить исходные тексты
- •Что требуется знать для чтения книги
- •Предисловие к первому изданию
- •Благодарности
- •1.3.Новая парадигма
- •Что читать дальше
- •Упражнения
- •2.7.3.Зацепление и связность
- •2.9. Выбор представления данных
- •Упражнения
- •Глава 3 Классы и методы
- •Упражнения
- •Глава 4 Сообщения, экземпляры и инициализация
- •Упражнения
- •Глава 5 Учебный пример: задача о восьми ферзях
- •Упражнения
- •Глава 6 Учебный пример: игра «Бильярд»
- •Упражнения
- •Глава 7 Наследование
- •7.6.Издержки наследования
- •Упражнения
- •Глава 8 Учебный пример: Пасьянс
- •8.4.1.Основание SuitPile
- •8.4.2.Колода DeckPile
- •Упражнения
- •9.1.1. «Быть экземпляром» и «включать как часть»
- •Упражнения
- •Глава 10 Подклассы и подтипы
- •Упражнения
- •Глава 11 Замещение и уточнение
- •Упражнения
- •Глава 12 Следствия наследования
- •Упражнения
- •Глава 13 Множественное наследование
- •13.1.Комплексные числа
- •Литература для дальнейшего чтения
- •Упражнения
- •Глава 14 Полиморфизм
- •Полиморфные переменные
- •Виртуальное и невиртуальное переопределение
- •Параметрическая перегрузка
- •Отложенные методы в C++
- •Обобщенные функции и шаблоны
- •Полиморфные переменные
- •Отложенные методы в Object Pascal
- •Полиморфные переменные
- •Отложенные методы в Objective-C
- •Полиморфные переменные
- •Отложенные методы в Smalltalk
- •Упражнения
- •Глава 15 Учебный пример: контейнерные классы
- •Упражнения
- •Глава 16 Пример: STL
- •Упражнения
- •Глава 17 Видимость и зависимость
- •Родственные экземпляры
- •Дружественные функции
- •Пространства имен
- •Постоянные члены
- •Упражнения
- •Глава 18 Среды и схемы разработки
- •18.1.1. Java API
- •Упражнения
- •19.5.Класс application
- •19.5.1.Класс button
- •Упражнения
- •Глава 20 Новый взгляд на классы
- •20.2.2.Класс Class
- •Упражнения
- •Глава 21 Реализация объектно-ориентированных языков
- •Литература для дальнейшего чтения
- •Упражнения
- •А.1. «Задача о восьми ферзях» на языке Apple Object Pascal
- •A.3. «Задача о восьми ферзях» на языке Java
- •A.3.1. HTML-файл для апплета Java
- •A.4. «Задача о восьми ферзях» на языке Objective-C
- •A.5. «Задача о восьми ферзях» на языке Smalltalk
- •Б.1. Версия без использования наследования
- •Б.2. Версия с использованием наследования
- •Глоссарий
converted to PDF by BoJIoc
Полиморфизм в языках программирования позволяет программисту создавать многократно используемые компоненты высокого уровня, которые можно перекраивать под различные приложения за счет изменения нижнего уровня. Мы еще поговорим об этом в последующих главах.
7.5.7. Маскировка информации
Программист, использующий программную компоненту, должен понимать только ее назначение и интерфейс. Программисту совсем не обязательно иметь подробную информацию о технических средствах, использованных при реализации компоненты.
Таким образом уменьшается необходимость внутренних связей между программными системами. Мы ранее указывали на «зацепляющийся» характер традиционных программных продуктов как на одну из причин их сложности.
7.6. Издержки наследования
Хотя преимущества наследования в объектно-ориентированном программировании несомненны, ничего не дается даром. По этой причине мы должны рассмотреть издержки технических средств объектно-ориентированного программирования — в частности, наследования.
7.6.1. Скорость выполнения
Редко программные инструменты общего назначения являются столь же быстрыми, как и аккуратно, «вручную» разработанные специальные системы. Таким образом, унаследованные методы, способные иметь дело с произвольными подклассами, часто медленнее специального кода.
И все же заботы об эффективности часто бывают не к месту 1 . Во-первых, разница не слишком велика. Во-вторых, снижение скорости выполнения может компенсироваться повышением скорости разработки программного обеспечения. И наконец, большинство программистов на самом деле мало знают о том, как распределены временные затраты в их программах. Гораздо лучше создать работающую систему, произвести замеры времени, чтобы обнаружить, на что же, собственно, оно тратится, и улучшить эти части, чем затратить уйму времени, заботясь об эффективности на ранних стадиях проекта.
7.6.2. Размер программ
Использование любой программной библиотеки часто приводит к увеличению размера программ. Этого не происходит в специально разработанных системах. Хотя такие затраты могут быть существенными, по мере уменьшения стоимости памяти размер программы перестает быть критичным. Снизить затраты на разработку и быстро выдать
высококачественный и свободный от ошибок программный код значит сейчас гораздо больше, чем малый размер приложения 2 .
7.6.3. Накладные расходы на посылку сообщений
Много внимания обращалось на тот факт, что посылка сообщений по своей сути более дорогая операция, чем просто вызов процедуры. Однако, как и с суммарной скоростью выполнения, слишком большие заботы о цене посылки сообщений часто бывают экономией на спичках. Между прочим, замедление
1 Следующая цитата из статьи Билла Вульфа предлагает удачное замечание по поводу важности эффективности: «Во имя эффективности (как правило, эфемерной) совершается больше программных ошибок, чем по какой-либо другой причине, включая полную тупость» [Wulf 1972].