Шаг 40.
Унифицированный язык моделирования UML.
Отношения между классами. Наследование

    На этом шаге рассмотрим отношение между классами - наследование.

    С семантической точки зрения, наследование, вероятно, является наиболее интересным среди отношений типа "обобщение/специализация". Однако опыт показывает, что одного наследования недостаточно для того, чтобы выразить все богатство отношений, существующих между основными абстракциями в исследуемой предметной области. Альтернативой наследованию является делегирование (delegation), означающее, что объект поручает реализацию своего поведения другим объектам.

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

    Телеметрические данные необходимо защитить. В противном случае ничто не мешает клиенту изменить важные значения, например, временную метку или значение текущей мощности. Кроме того, представление телеметрических данных открыто, так что если потребуется его изменить (например, добавить новые элементы или изменить настройку существующих), то это затронет каждого клиента. Как минимум, приходится заново компилировать все ссылки на данную структуру. Еще важнее то, что эти изменения могут не соответствовать предположениям клиентов о представлении телеметрических данных и тем самым могут разрушить логику программы.

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

    Ненамного лучше было бы объявить отдельный класс для каждого вида телеметрических данных. Это позволило бы скрыть представление каждого класса и установить связь между данными и его поведением. Однако этот подход не решает проблему избыточности.

    Следовательно, значительно лучше построить иерархию классов, в которой специализированные классы наследуют структуру и поведение, определенные в более обобщенных классах.

    Класс ElectricalData наследует структуру и поведение класса TelemetryData. При этом он вносит добавления в структуру суперкласса (дополнительные измерения напряжения), а также уточняет (функция transmit, передающая дополнительные данные) и даже расширяет его поведение (функция currentPower, передающая величину текущей мощности).

    Наследование — это отношение между классами, в котором один класс повторяет структуру и поведение одного (одиночное наследование) или нескольких (множественное наследование) классов.

    На следующем шаге рассмотрим одиночное наследование.




Предыдущий шаг Содержание Следующий шаг