|
Программирование >> Дополнительные возможности наследования
Venus (четырехдверный седан с двигателем средней мощности), Mars (спортивный автомобиль типа купе с наиболее мощным двигателем, рассчитанный на максимальную скорость), Jupiter (мини-фургон с форсированным двигателем как у спортивного купе, правда, менее скоростной, зато более мощный) и Earth (маломощный, но скоростной фургон). Можно было бы просто произвести все эти модели от общего класса Саг, как показано на рис. 18.17. Рис. 18.17. Обобщение подклассов всех моделей в общий базовый класс Но давайте более детально проанализируем различия между моделями. Очевидно, что они различаются мощностью двигателя, типами кузова и специализацией. Комбинируя эти основные признаки, мы получим характеристики различных моделей. Таким образом, в нащем примере важнее сконцентрировать внимание не на названиях моделей, а на их основных признаках. Такие признаки называются дискриминаторами и в UML отображаются особым образом (см. рис. 18.17). Автомобиль Форсированный Двигатель Ж Назначение Кузов Седан Купе Малолитражный Семейный Спортивный Рис. 18.18. Модель отношения дискриминаторов Диафамма на рис. 18.18 показывает, что классы разных моделей можно производить от класса Автомобиль, комбинируя такие дискриминаторы, как мощность двигателя, тип кузова и назначение автомобиля. Каждый дискриминатор можно реализовать в виде простого перечисления. Например, объявим перечисление типов кузова: enum BodyType={sedan, coupe, minivan, stationwagon} Однако далеко не каждый дискриминатора можно объявить, просто назвав его. Например, назначение определяется многими параметрами. В таком случае дискриминатор можно смоделировать как класс, и разные типы дискриминатора будут возвращаться как объекты класса. Таким образом, технические характеристики автомобиля, определяющие его использование, могут быть представлены объектом типа performance, содержащим данные о скорости, габаритах и прочих характеристиках. В UML классы, в которых инкапсулирован дискриминатор и которые используются для создания экземпляров другого класса (в нащем примере класса Автомобиль) таким образом, что разные экземпляры класса приобретают характеристики разных типов (например. Спортивный автомобиль и Семейный автомобиль), называются силовыми. В нащем примере класс Назначение (performance) является силовым для класса Автомобиль. При создании объекта класса Автомобиль также создается объект Назначение, который ассоциируется с текущим объектом Автомобиль, как показано на рис. 18.19. Использование силовых классов позволяет создавать различные логические типы, не прибегая к наследованию. Поэтому в профамме можно легко манипулировать множеством типов, не создавая класс для каждого нового типа. Обычно в профаммах на С++ использование силовых классов реализуется с помощью указателей. Так, в нашем примере класс Саг (соответствующий классу проекта Автомобиль) будет содержать указатель на объект класса PerformanceCharacteristics (рис. 18.20). Если хотите пофенироваться, создайте самостоятельно силовые классы для дискриминаторов Кузов (body) и Двигатель (engine). Class Car : public Vehicle { public: CarO; -Car(): другие открытые методы опущены private: PerformanceCharacteristics*pPerformance; И наконец, силовые классы дают возможность создавать новые типы данных во время выполнения профаммы. Поскольку каждый логический тип различается только афибутами ассоциированных с ним силовых классов, то эти афибуты могут быть параметрами консфукторов данных силовых классов. Это означает, что можно во время выполнения профаммы создавать новые типы автомобилей, изменяя установки афибутов силовых классов. Число новых типов, которые можно создать во время вьшолнения профаммы, офаничивается только числом логических комбинаций афибутов разных силовых классов. В модели проекта важно указать не только отношения между классами, но и принципы их взаимодействия. Например, классы Расчетный счет, ATM и Квитанция взаимодействуют с классом Клиент в ситуации Снятие со счета. Возвращаясь к виду последовательных диафамм, которые использовались в начале анализа (см. рис. 18.11), рас-смофим теперь взаимодействие классов на основе определенных для них методов, как показано на рис. 18.21. 8720 Автомобиль Форсированный Двигатель t i >jk Назначение:РегТогтапсеСЬагас1еп51!с5 Кузов Седан Купе Малолитражный Семейный powertvpe Performance Characteristics shift Point maxRPM accelerate Спортивный ± Family:PerformanceCharacteristics SportrPerformanceCfiaracteristics Puc. 18.19. Дискриминатор как силовой класс
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |