Определение UML - Обобщение, агрегация и абстрактные классы
Я немного запутался в отношении обобщений, агрегации и абстрактных классов в UML.
Под обобщением я могу понять, что это "есть" отношение. Ученик - это личность, а учитель - это личность. Таким образом, Персона будет суперклассом, тогда как ученик и учитель являются подклассами.
Под Агрегацией это то, что я понимаю: это "более мягкое" отношение по сравнению с композицией. Примером может быть: У вас может быть рука без пальцев (агрегация), но вы не можете иметь пальцы без руки (композиция).
И тогда я полностью теряюсь на абстрактных классах. Каковы характеристики абстрактных классов? Я хотел бы привести пример, если это возможно.
Но я на правильном пути здесь? Вот как я понимаю эти термины.
1 ответ
Вы понимаете обобщения.
Ассоциации могут быть Агрегациями или Композициями (или ни одной). Это хороший пример, который использовал Том Пендер. Предположим, у вас есть класс автомобилей. Этот класс автомобилей "имеет" руль, сиденья, две оси, четыре колеса и так далее. Если вы создаете этот Автомобиль в контексте производителя, отношения между ними будут такими: Композиция: срок службы всех частей автомобиля (у вашего производителя) зависит от срока службы автомобиля. С точки зрения производителя, срок службы автомобиля и всех его частей заканчивается, когда вы доставляете его дилеру.
Теперь предположим, что вы владелец свалки. В этом случае у автомобиля все еще есть все эти части, но у них есть собственный срок службы: вы можете продавать запчасти вне автомобиля и даже делать их частью какого-то другого автомобиля, если вам это нужно. Отношения между автомобилем и этими частями являются агрегацией, потому что срок службы частей не привязан к сроку службы самого автомобиля.
Итак, вы можете видеть, что один и тот же автомобиль может быть смоделирован двумя разными способами в зависимости от контекста.
Что касается абстрактных классов: абстрактный класс - это просто класс, который определяет методы и / или свойства, требуя, чтобы они могли быть реализованы только в подклассах. Проще всего объяснить почему с интерфейсами. Интерфейсы являются абстрактными классами, с добавлением, что НИКАКИЕ методы или свойства могут быть реализованы непосредственно в классе (вы можете сказать, что это определение того, как определить подкласс). Вот где они полезны.
Предположим, я хочу определить класс Animal. Что делают животные? Ну, они двигаются. Они кусаются. (Конечно, они тоже занимаются другими вещами, но давайте придерживаться Move и Bite.) Если я создаю интерфейс Animal, я говорю: "Вот то, что делает животное. Если вы хотите быть животным, вы должны также сделать эти вещи. Однако я не собираюсь рассказывать вам, как это сделать ". Итак, я создаю интерфейс iAnimal с двумя методами, Move и Bite. Как интерфейс, я не предоставляю никакой реализации, просто пустые процедуры.
Теперь, предположим, у меня есть два животных, блоха и TRex. Очевидно, что блохи и TRexes не имеют ничего общего в том, как они двигаются или как они кусаются, но они оба делают и то, и другое. Я сделаю так, чтобы Flea и TRex наследовали или "внедряли" интерфейс, предоставляя реализации Move и Bite, соответствующие типу животных.
Преимущество этого состоит в том, что клиенты моей блохи и trex не должны знать, с кем они имеют дело. Они могут создавать iAnimal, внедрять экземпляр Flea или TRex в зависимости от ситуации и безопасно вызывать методы Move и / или Bite iAnimal, не беспокоясь о том, поддерживаются они или нет. (Это то, что мы подразумеваем под "полиморфизмом").
Итак, реализация интерфейса - это форма обобщения (точнее специализация, идущая в другую сторону), как вы, наверное, уже догадались.
Отсюда "абстрактный класс" - это просто любой класс с любым определенным методом или атрибутом, который должен быть унаследован для реализации. Поэтому, как я уже сказал, интерфейсы являются абстрактными классами. Однако в общем случае под абстрактным классом подразумевается тот, который не является также интерфейсом, т. Е. Тот, который имеет некоторые конкретные методы или атрибуты. Большинство языков программирования придерживаются этого определения.