Как представить вложенный UML-класс в С++? класс A { класс B { } }
Как представить вложенный UML-класс в С++?
Ответ 1
Я подумал, что спецификация ушла от обозначения кросс-круга. Итак, я немного бродил по спецификациям и не мог найти его в версии 2.0. Я должен сделать вывод, что спецификация 2.0 больше не поддерживает его. Хотя на самом деле это было указано в версии 1.4, я просмотрел спецификацию 2.4.1, и ее нигде не видно (на самом деле слово "anchor" возвращает 0 результатов в поиск по всему документу). Я немного поглядел вокруг, и вот что я могу собрать вместе.
Во-первых, я всегда понимал, что вложенные классы являются средством реализации композиции. Кроме того, UML пытается быть агностическим, а вложенные классы - нет. (Вы можете создавать композиции другими способами, и не все языки OO поддерживают вложенные классы.) Теперь в 1.4 объяснение включено следующее:
Если класс B присоединен к классу A "якорной" строкой с символом "привязки" в классе A, тогда класс B объявляется в пространстве имен класса A. То есть взаимосвязь между классами A и классом B это ассоциация элементов, принадлежащая пространству имен.
Ok. Теперь UML 2.0 говорит следующее:
Пакет ядра представляет собой основные концепции моделирования UML, включая классы, ассоциации и пакеты.
Вот диаграмма пакета Kernel:
Это довольно сложно, но посмотрите на абстрактный класс NamedElement в левом верхнем углу. (Класс "NamedElement" - это элемент, имеющий имя.) Обратите внимание, что из него исходит пространство имен. Теперь заметьте справа, прямо справа от вершины класса пространства имен, еще один класс NamedElement. Одна из ассоциаций имеет свойство {subsets ownedElement} на нем и составной алмаз на конце пространства имен. В конце пространства имен существует свойство {subsets owner}.
Это означает, что NamedElement, когда в ассоциации композиций с Namespace, является подмножеством пространства имен. Другими словами, связь между Namespace и NamedElement является ассоциацией, принадлежащей пространству имен, описанной в спецификации 1.4. Следовательно, отношение композиции, украшенное пространством имен и свойствами OwnElement, представляет собой вложенный (или внутренний, или внутренний, или любой другой язык вашего любимого языка кодирования).
Итак, я собираюсь сказать, что это приемлемый способ 2.0 показать вложенные классы, если вы используете нотацию композиции. Вот так:
Теперь другой способ - вставить вложенный класс внутри содержащего класса. Примеры обозначений в спецификации не показывают эту AFAICS, но они показывают ее с другими NamedElements (пакеты, компоненты и т.д.), Поэтому я не понимаю, почему вы не можете.
Однако я не вижу, что якорная нотация актуальна. Любимый сайт xmojmr (и хороший сайт тоже), www.uml-diagrams.org, должен сказать об этом:
Теперь устаревший UML 1.4.2 Спецификация определила вложенный класс как класс, объявленный в другом классе и принадлежащий пространству имен объявляющего класса. Связь между этими классами называлась "ассоциация, принадлежащая ассоциации имен"
Вложенный классификатор, например. вложенный класс, вложенный интерфейс или вложенный вариант использования могут использоваться как любой другой классификатор, но только внутри содержащего класса или интерфейса.
В UML 1.4.2 класс объявления (вложенности) и вложенный класс могут быть показаны соединенными линией с иконкой "якорь" на конце, связанной с объявляющим классом. Значок привязки - это крест внутри круга.
Спецификации UML 2.x - включая недавний UML 2.4.1 - описывают вложение классификаторов в структурированных классах без предоставления явных обозначений для вложенности. Обратите внимание, что нотация UML 1.4 "якорь" по-прежнему используется в одном примере в UML 2.4.x для пакетов как "альтернативная нотация участников" и без каких-либо других подробностей или объяснений.
Я не мог найти эту диаграмму "один пример", поэтому, возможно, она все еще существует. Но, по крайней мере, обозначение кажется устаревшим. Я либо использовал бы свойства, создаю стереотип <<nested>>
, либо помещал вложенный класс внутри класса владельца.
Ответ 2
Вложенный класс в UML (для любого языка) может быть представлен как:
Здесь
- Класс Inner1 вложен внутри внешнего класса Outer 1
- Классы Inner2, Inner3, Inner4 вложены внутри Outer2
Ссылка, взятая из здесь
Ответ 3
Вложенные классы могут отображаться внутри ветки внешнего класса.
Раздел 9.2.4.1 спецификации UML версии 2.5.1 гласит:
Если у классификатора есть OwnerMembers, которые являются классификаторами, соответствующий инструмент может предоставить возможность показать собственные классификаторы и взаимосвязи между ними, схематически вложенные в отдельный отсек прямоangularьника-классификатора-владельца. (...) Например, раздел, в котором отображается содержимое свойства nestedClassifier для класса (см. 11.4.2), должен называться "вложенными классификаторами".
В качестве альтернативы, вложенные классы могут отображаться с использованием нотации "кружок плюс":
Раздел 7.4.4.1 спецификации UML 2.5.1 гласит:
Соответствующие инструменты могут по желанию разрешать нотацию "круг-плюс", определенную в подпункте 12.2.4, для отображения членства в Пакете, который также может использоваться для отображения членства в других видах пространств имен (например, для отображения nestedClassifiers).
(Я скопировал изображение из ответа, опубликованного @stamhaney)