Определение UML - Обобщение, агрегация и абстрактные классы

Я немного запутался в отношении обобщений, агрегации и абстрактных классов в UML.

Под обобщением я могу понять, что это "есть" отношение. Ученик - это личность, а учитель - это личность. Таким образом, Персона будет суперклассом, тогда как ученик и учитель являются подклассами.

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

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

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

1 ответ

Решение

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам