|
Программирование >> Структурное программирование
Базовый класс описывает общие черты объектов. Все классы, порожденные базовым классом, наследуют возможности этого базового класса. В процессе объектно-ориентированного проектирования разработчик отыскивает общие черты объектов и выражает их в форме базового класса. Производные классы затем пополняются дополнительными по сравнению с унаследованными от базового класса возможностями. 9.11. Проектирование программного обеспечения с помощью наследования Мы можем использовать наследование для настройки существующего программного обеспечения. Мы наследуем атрибуты и функции существующего класса, а затем добавляем атрибуты и функции, необходимые для настройки класса под наши нужды. Это делается в C-I-I- без доступа производного класса к исходному тексту базового класса, но производный класс должен иметь возможность компоноваться с объектным кодом базового класса. Такая возможность, заложенная в C-I-I-, привлекательна для независимых продавцов программного обеспечения (НППО). НППО могут разрабатывать собственные классы для продажи или лицензирования и делать эти классы доступными пользователям в форме объектного кода. Пользователи затем могут быстро создавать новые классы из этих библиотечных классов без доступа к собственным исходным кодам НППО. Все, что требуется от НППО, - это снабжать объектные коды заголовочными файлами. Студентам может быть трудно проникнуться проблемами, с которыми сталкиваются разработчики и создатели крупных программных проектов. Опытные разработчики таких систем будут неизменно заявлять, что ключом к улучшению процесса разработки программного обеспечения является повторное использование программных кодов. Объектно-ориентированное программирование вообще, и на С-Н- в частности, несомненно обеспечивают это. Доступность важных и полезных библиотек классов обеспечивает максимальные преимущества повторного использования кодов посредством наследования. Интерес к библиотекам классов будет расти так же, как интерес к C-I-I-. Создание и продажа библиотек классов становится такой же бы-строразвивающейся индустрией, как и производимое независимыми продавцами компактное программное обеспечение в эпоху появления первых персональных компьютеров. Разработчики приложений будут строить свои приложения с помощью этих библиотек, а разработчики библиотек будут вознаграждены тем, что их библиотеки широко используются в приложениях. Библиотеки, непрерывно пополняемые с помощью компиляторов С-1-i-, имеют тенденцию становиться направленными на определенные сферы применения. Вот почему мы видим повсеместное стремление создавать библиотеки классов для огромного разнообразия конкретных применений. Замечание по технике программирования 9.6 Создание производного класса не влияет на исходный или объектный код базового класса; сохранноаь базового класса оберегается наследованием. Точно так же, как разработчик не объектно-ориентированных систем старается избежать не вызванного необходимостью быстрого роста числа функций, разработчик объектно-ориентированных систем должен избегать не вызванного необходимостью быстрого роста числа классов. Такое разрастание классов создает проблемы управления и может помешать повторному использованию кодов просто потому, что потенциальному повторному пользователю слишком трудно выделить нужный ему класс из огромного набора имеюш;ихся. Выходом из положения является создание меньшего числа классов, но таких, каждый из которых обеспечен широкими функциональными возможностями. Такие классы могли бы быть несколько более дорогими для пользователей; они могут скрыть ненужные им избыточные функциональные возможности, приспосабливая таким образом классы для удовлетворения своих потребностей. Совет по повышению эффективности 9.1 Если классы, полученные путем наследования, более широкие, чем необходимо, это ведет к потере ресурсов памяти и производительности. Наследуйте из класса только самое необходимое. Заметим, что чтение объявлений производных классов может приводить к недоразумениям, поскольку в них не показаны унаследованные элементы, которые тем не менее присутствуют в производных классах. Аналогичные проблемы могут существовать и с документацией на производные классы. Замечание по технике программирования 9.7 В объектно-ориентированных системах классы часто тесно связаны. Факторизуйте общие атрибуты и функции и помещайте их в базовом классе. Затем используйте наследование для формирования производных классов. Замечание по технике программирования 9.8 Производный класс содержит атрибуты и функции своего базового класса. Производный класс может также содержать дополнительные атрибуты и функции. При наследовании базовый класс может быть скомпилирован независимо от производного класса. При формировании производного класса нужно компилировать только дополнительные атрибуты и функции; их объединение с базовым классом сформирует производный класс. Замечание по технике программирования 9.9 Изменения в базовом классе не требуют изменений в производных классах до тех пор, пока открытый интерфейс базового класса остается неизменным. Однако, производные классы могут нуждаться при этом в перекомпиляции. 9.12. Композиция и наследование Мы обсудили отношения является , которое поддерживается наследованием. Мы обсудили также отношения содержит (и видели примеры в предыдущих главах), при которых класс может содержать другие классы в 9.13. Отношения использует А и знает А и наследование, и композиция способствуют повторному использованию кодов путем создания новых классов, которые имеют много общего с существующими классами. Имеются и другие способы использования услуг классов. Хотя объект человек не является автомобилем и не содержит автомобиль, но, конечно, объект человек использует автомобиль. Отношение использует объект осуществляется просто путем обращения к функции-элементу этого объекта. Функция может знать другой объект. Базы знаний часто используют такие отношения. Для того, чтобы один объект знал о другом достаточно, чтобы объект содержал указатель или ссылку на этот другой объект. В этом случае говорят, что один объект находится в отношении знает с другим объектом. 9.14. Учебный пример: точка, круг, цилиндр Рассмотрим теперь основное упражнение этой главы. Мы рассмотрим иерархию точка, круг, цилиндр. Сначала мы разработаем и используем класс Point (рис. 9.8). Затем мы представим пример, в котором класс Circle является производным классом от класса Point (рис. 9.9). В заключение, мы представим пример, в котором класс Cylinder является наследником класса Circle (рис. 9.10). Класс Point представлен на рис. 9.8. Часть 1 - это определение класса Point. Отметим, что элементы класса Point - защищенные. Таким образом, когда класс Circle наследует классу Point, функции-элементы класса Circle могут непосредственно ссылаться на координаты х и у, что предпочтительнее, чем использование функций доступа. Это дает лучшую производительность. На рис. 9.8 часть 2 представлены определения функций-элементов класса Point, а на рис. 9.8 часть 3 представлена программа драйвер класса Point. Заметим, что main должна использовать функции доступа getX и getY, чтобы читать значения защищенных данных-элементов х и у; напомним, что защищенные данные-элементы доступны только элементам и друзьям их класса и производного класса. качестве элементов; такие отношения создают новые классы композицией существующих классов. Например, для классов Employee (служащий), Birth-Day (день рождения) и TelephoneNumber (номер телефона) было бы неуместно говорить, что Employee является BirthDay или что Employee является TelephoneNumber. Замечание по технике программирования 9.10 Программные модификации класса, который является элементом другого класса, не требуют изменения вмещающего класса до тех пор, пока остается неизменным открытый интерфейс класса-элемента. Отметим, однако, что класс композиции может нуждаться в перекомпиляции.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |