Короткий ответ таков: как любая конкретная конструкция исходного языка должна быть представлена в UML, не является строго определенной.Это было бы частью стандартизированного профиля UML для рассматриваемого языка, но, к сожалению, их мало и они далеко друг от друга.Далее следует длинный ответ.
В вашем примере, я боюсь, мне пришлось бы сказать «ни», просто чтобы быть трудным.A
имеет переменную-член типа B
, поэтому отношение на самом деле является агрегацией или композицией ... или направленной ассоциацией.В UML направленная ассоциация с именованной целевой ролью семантически эквивалентна атрибуту с соответствующим именем.
Как правило, это агрегация, если b
инициализируется в конструкторе A
;это композиция, если она также уничтожается в деструкторе B
(общий жизненный цикл).Если ни то, ни другое не применимо, это атрибут / направленная ассоциация.
Если b
не был переменной-членом в A
, а локальная переменная b
не была задействована (для нее не было вызвано никаких методов)тогда я представлял бы это как зависимость: A
нуждается в B
, но у него нет атрибута этого типа.
Но f()
фактически вызывает метод, определенный в B
.Для меня это делает правильное отношение <<use>>
, которое является более специализированной формой зависимости.
Наконец, (ненаправленная) ассоциация является самой слабой формой связи между двумя классами, и именно по этой причине ясклонны не использовать их при описании исходных конструкций.Когда я это делаю, я обычно использую их, когда нет прямых отношений исходного кода, но эти два класса все еще как-то связаны.Примером этого может быть ситуация, когда оба отвечают за разные части одного и того же более крупного алгоритма, но третий класс использует их оба.