КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Множественное наследование
Абстрактные классы Абстрактным (abstract) называется класс, не имеющий непосредственных экземпляров. Непосредственные экземпляры могут быть у потомков класса. Конкретным называется класс, который может порождать экземпляры. Конкретный класс может иметь абстрактные подклассы (но у них, в свою очередь, обязательно должны быть конкретные потомки). Листьями дерева наследования могут быть только конкретные классы. Все виды деятельности на рис. 36 являются конкретными классами. Butcher (Мясник), Baker (Пекарь) и CandlestickMaker (ПроизводительПодсвечников) — конкретные классы, поскольку у них есть непосредственные экземпляры. Worker (Работник) — это тоже конкретный класс, потому что некоторые виды деятельности не имеют собственных названий. Рисунок 36 – Конкретные классы
Примером абстрактного класса является класс Employee (Служащий) на рис. 37. Все служащие должны иметь либо полную, либо частичную занятость. FullTimeEmployee (СлужащийНаПолнойЗанятости) и PartTimeEmployee (СлужащийНаЧастичнойЗанятости) — конкретные классы, поскольку они могут иметь непосредственные экземпляры. В системе обозначений UML имя абстрактного класса выделяется курсивом. Под именем абстрактного класса или после него можно указать ключевое слово {abstract}. Рисунок 37 – Абстрактный класс и абстрактная операция
Абстрактные классы могут использоваться для определения методов, которые будут наследоваться подклассами. Абстрактный класс может определить только сигнатуру операции без реализующего ее метода. Такая операция называется абстрактной. (Вспомните, что операция указывает форму функции или процедуры. Реализацией ее является метод.) Абстрактная операция определяет сигнатуру операции, реализацию которой должен предоставить каждый конкретный подкласс. Конкретный класс не может содержать абстрактные операции, потому что иначе его экземпляры имели бы неопределенные методы. На рис. 36 показана абстрактная операция. Она выделяется курсивом или ключевым словом {abstract}. В нашем примере ComputePay (ВычислитьЗарплату) является абстрактной операцией класса Employee (Сотрудник). В классе определена только сигнатура операции, но не ее реализация. Каждый конкретный подкласс должен предоставить метод, реализующий данную операцию. С точки зрения стиля моделирования, лучше всего стараться избегать конкретных суперклассов. В этом случае деление классов на абстрактные и конкретные становится очевидным: все суперклассы являются абстрактными, а все листья дерева наследования — конкретными. Более того, это позволит вам избежать неудачных ситуаций, в которых конкретный суперкласс должен не только указывать сигнатуру операции для своих потомков, но и приводить ее реализацию. Избежать конкретности суперкласса можно, добавив в модель подкласс Other (Прочие), как показано на рис. 38. Рисунок 38 – Избежание конкретности суперкласса
Множественное наследование позволяет классу иметь несколько суперклассов и наследовать составляющие от всех предков. Это позволяет смешивать информацию из нескольких источников. Множественное наследование является более сложной формой обобщения по сравнению с единичным наследованием, ограничивающим иерархию классов до дерева. Преимущество множественного наследования в увеличении возможностей спецификации классов и их повторного использования. Недостаток — усложнение концепций и реализации. Термин множественное наследование иногда используется для обозначения концептуального отношения между классами или механизма языка, реализующего это отношение. Мы всегда стараемся делать различие между обобщением (концептуальным отношением) и наследованием (механизмом языка), однако термин «множественное наследование» используется чаще, чем «множественное обобщение». Чаще всего множественное наследование используется для наследования от множества несовместных классов. Каждый подкласс является потомком одного класса из каждого множества. На рис. 39 FullTimelndividualContributor является одновременно FullTimeEmployee и IndividualContributor и сочетает в себе их составляющие. Классы FullTimeEmployee и PartTimeEmployee являются несовместными, то есть каждый сотрудник принадлежит ровно одному из них. Классы Manager и IndividualContributor тоже являются несовместными. Мы могли бы определить три дополнительных класса: FullTimeManager, PartTimelndividualContributor и PartTimeManager. Допустимые комбинации зависят от приложения. Каждое обобщение должно производиться по одному аспекту. Множественное наследование можно использовать в том случае, если класс можно уточнить по нескольким независимым аспектам. На рис. 39 класс Employee уточняется по занятости и участию в управлении. Поэтому модель содержит два набора обобщений.
Рисунок 39 – Множественное наследование от несовместных классов
Подкласс наследует составляющие от каждого суперкласса только один раз, даже если к нему ведут несколько путей по графу обобщений. Например, на рис. 38 FullTimelndividualContributor наследует составляющие Employee по двум путям: через employmentstatus и managerialStatus. Однако каждый FullTimelndividualContributor будет иметь только одну копию составляющих Employee. Конфликты между параллельными определениями создают двусмысленности, которые должны разрешаться на уровне реализации. На практике следует избегать подобных двусмысленностей в моделях или разрешать их явным образом, даже если в используемом языке программирования имеются правила разрешения конфликтов. Предположим, к примеру, что в классах FullTimeEmployee и IndividualContributor определен атрибут пате. При этом FullTimeEmployee.name может подразумевать полное имя сотрудника, a IndividualContributor.name — его титулили звание. Очевидного способа разрешения такого конфликта не существует. Лучше всего переименовать атрибуты, например, так: FullTimeEmployee.personName и IndividualContributor.title. Рисунок 40 – Множественное наследование от перекрывающихся классов
Множественное наследование может иметь место с перекрывающимися классами. На рис. 40 AmphibiousVehicle (Амфибия) является одновременно LandVehicle (НаземноеТранспортноеСредство) и WaterVehicle (НадводноеТранспортноеСредство). Классы LandVehicle и WaterVehicle перекрываются, поскольку некоторые транспортные средства могут перемещаться как по земле, так и по воде. Для обозначения перекрывающихся наборов обобщений в UML используются ограничения. Для обозначения используется пунктирная линия, которая проводится поперек перекрывающихся обобщений. Около линии ставятся ключевые слова в фигурных скобках. В нашем примере ключевое слово overlapping означает, что транспортное средство может принадлежать одновременно к нескольким подклассам. Ключевое слово incomplete означает, что на диаграмме не перечислены все возможные подклассы класса Vehicle.
Дата добавления: 2013-12-13; Просмотров: 606; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |