2014-12-26 6 views
0

Я немного смущен относительно обобщения, агрегации и абстрактных классов в UML.Определение UML - классы обобщения, агрегации и абстракции

По обобщению, я могу понять, что это «» - это отношение «». Студент является Человек - и учитель является Лицо. Таким образом, человек будет суперклассом, тогда как ученик и учитель - оба подкласса.

Посредством аггрегации это то, что я понимаю: это «более мягкое» отношение по сравнению с композицией. Примером может быть: у вас может быть рука без пальцев (агрегация), но вы не можете иметь пальцы без руки (композиции).

И тогда я полностью потерял абстрактные классы. Каковы характеристики абстрактных классов? Я бы хотел привести пример, если это возможно.

Но я нахожусь на правильном пути здесь? Вот как я понимаю эти термины.

+0

Частичный ответ, который другие могут не уловить: ученик и учитель - это роли, а не люди. Использование специализаций делает невозможным, чтобы человек был учителем и учеником одновременно или по истории. –

ответ

0

Вы понимаете Обобщение.

Ассоциациями могут быть Агрегации или Композиции (или ни одна из них). Это хороший пример, который использовал Том Пендер. Предположим, у вас есть класс Car. В этом классе автомобилей «есть» рулевое колесо, сиденья, две оси, четыре колеса и т. Д. Если вы создаете этот автомобиль в контексте производителя, отношения между ними будут составлять: Состав всех частей автомобиля (у вашего производителя) привязан к сроку службы автомобиля. С точки зрения производителя, срок службы автомобиля и всех его частей заканчивается, когда вы доставляете его дилеру.

Теперь давайте предположим, что вы являетесь владельцем свалки. В этом случае автомобиль все еще «имеет» все эти части, но у них есть своя собственная жизнь: вы можете продавать детали с автомобиля и даже делать их частью какого-либо другого автомобиля, если вам нужно. Связь между автомобилем и этими частями - это агрегация, поскольку срок службы деталей не привязан к времени жизни самого автомобиля.

Итак, вы можете видеть, что один и тот же автомобиль может быть смоделирован по-разному в зависимости от контекста.

Что касается абстрактных классов: абстрактный класс - это просто класс, который определяет методы и/или свойства, требуя, чтобы их можно было реализовать только в подклассах. Проще всего объяснить, почему с интерфейсами. Интерфейсы - это абстрактные классы, с добавленной оговоркой, что NONE из методов или свойств может быть реализовано непосредственно в классе (вы можете сказать, что это определение того, как определить подкласс). Вот где они приходят полезными.

Предположим, я хочу определить класс Animal. Что делают животные? Ну, они двигаются. Они кусают. (Конечно, они делают и другие вещи, но давайте придерживаться Move and Bite.) Если я создаю интерфейс Animal, я говорю: «Вот что делает животное. Если вы хотите быть животным, вам также нужно сделать но я не собираюсь рассказывать вам, как им это делать ». Итак, я создаю интерфейс iAnimal, используя два метода: Move and Bite. В качестве интерфейса я не предоставляю никакой реализации, просто пустые процедуры.

Теперь предположим, что у меня есть два животных, блоха и TRex. Ясно, что блохи и TRexes не имеют ничего общего в том, как они двигаются, или о том, как они кусают, но оба делают оба. У меня будет Flea и TRex наследуют или «реализуют» интерфейс, обеспечивая реализации Move и Bite, соответствующие типу животного.

Преимущество этого в том, что клиенты моей блохи и trex не должны знать, с кем они имеют дело.Они могут создавать iAnimal, при необходимости вставлять экземпляр Flea или TRex и безопасно вызывать методы Move и/или Bite для iAnimal без поддержки или отсутствия поддержки. (Это то, что мы подразумеваем под «полиморфизмом»).

Итак, реализация интерфейса - это форма обобщения (более правильно Специализация, идя в другую сторону), как вы, вероятно, уже догадались.

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

+0

Спасибо. Это имеет большой смысл, и мне очень нравятся все ваши примеры :) –

+0

Приглашаем вас. :) – BobRodes