#uml
#uml
Вопрос:
У меня есть класс с именем pet
, который динамически связан либо с 1, dog
либо cat
, но не с обоими одновременно.
Как называется этот тип динамической ассоциации? Как я могу представить это на диаграмме классов UML, давая понять, что каждый из них pet
связан с одним dog
или cat
, но не с обоими одновременно?
Ответ №1:
Является ли то, что вам нужно, просто наследованием? Домашнее животное кажется мне абстрактным понятием, где, как собака и кошка, были бы конкретными понятиями. Моим первоначальным решением в вашей ситуации, вероятно, было бы иметь абстрактный класс Pet (который не может быть создан), который специализируется на Dog и Cat (которые могут).
Если вы действительно хотите иметь экземпляр Pet, который связан с экземпляром кошки или собаки, то вам, вероятно, все равно придется управлять этим путем наследования. Возможно, что-то вроде этого:
Комментарии:
1. Спасибо. что, если я хочу связать pet с другим совершенно другим объектом, таким как ‘Couch’. Но она должна быть связана только с 1 животным или 1 кушеткой, но не с обоими
2. Хм, ну, я думаю, что, вероятно, задача состоит в том, чтобы выяснить, какой самый высокий уровень абстракции вам нужен в этих отношениях. Я полагаю, что в самом абстрактном виде вы могли бы связать Pet с «Объектом», который будет служить наивысшим уровнем абстракции и может быть получен буквально из чего угодно. Я не уверен, что общего у кушеток и животных, кроме того, что они оба являются объектами, и животные имеют сходство с кушетками 🙂 .
3. Отличный ответ. Только кратность 0 .. * является странной. Это означает, что животное может быть связано с несколькими домашними животными одновременно. Я думаю, что кратность должна быть 0 .. 1.
4. Если бы кратность была 0 .. 1 или 1 на стороне Pet, то логически Animal и Pet — это одно и то же (т. Е. Отношение 1 к 1), поэтому не было бы смысла отделять Pet от Animal. В любом случае, это были мои рассуждения.
Ответ №2:
Формулировка вашего вопроса немного забавна при чтении его как модели реального мира (модели предметной области).
В реальном мире домашнее животное не ассоциируется с животным. Скорее, домашнее животное ЭТО животное. Следовательно, класс pets
является подклассом (ролевым) animals
в модели предметной области, основанной на значении термина «pet» на английском языке.
Концепция классов ролей не очень хорошо поддерживается основными языками ООП. Объект может играть много ролей (то есть создавать экземпляры многих классов ролей) одновременно (множественная классификация), и он может перестать играть роль, то есть перестать создавать экземпляры соответствующего класса ролей (динамическая классификация).
Возможно, вам не интересно сначала создавать модель предметной области, прежде чем создавать (независимую от технологии) модель проектирования, которую вы затем можете превратить, например, в модель класса Java или C #.
Возможно, вы хотите перейти непосредственно к модели класса C , не пытаясь сначала понять базовые концепции предметной области.
Вы можете это сделать, но я не думаю, что это хорошая идея.