Ограничения универсального типа (предложение where) в UML

У меня есть общий класс С#, который выглядит так:

public class Database<T>
    where T : class, IModel, new()
{
    //Some code ...
}

T должен реализовать интерфейс IModel, а T должен быть классом с пустым конструктором.

Вопрос в том, как это выглядит на диаграмме классов UML.

Спасибо.


person Genfood    schedule 29.05.2017    source источник
comment
Возможный дубликат представления универсального метода C# в классе UML Диаграмма   -  person Peter Uhnak    schedule 18.08.2017


Ответы (1)


Короче:

UML использует для этой цели шаблоны классов:

Шаблон класса UML с обычным полем класса и небольшим прямоугольником с точками, перекрывающим правый верхний угол, в котором отображаются параметры шаблона

Чтобы это работало, вам нужно где-то определить (в профиле C#?), что NewConstraint — это специальный интерфейс, который требует, чтобы реализующий класс имел конструктор без параметров. В качестве альтернативы вы можете пропустить это NewConstraint и добавить простое ограничение UML (например, примечание с ограничением в открытом тексте { T shall have a parameterless constructor } )

Еще несколько пояснений о параметрах шаблона

Дополнительные сведения о синтаксисе шаблона классификатора UML можно найти в спецификациях UML (стр. 103):

ClassifierTemplateParameter расширяет нотацию для TemplateParameter и включает необязательное ограничение типа:

<classifier-template-parameter> ::=
<parameter-name> [ ‘:‘ <parameter-kind> ] [‘>’ <constraint>]
[‘=’ <default>]
<constraint> ::= [‘{contract }’] <classifier-name>*

parameter-kind указывает метакласс parameteredElement. Он может быть скрыт, если это «Класс».

имя-классификатора ограничения обозначает constrainingClassifier, которых может быть ноль или более, со значением, указанным в семантике выше. Параметр «контракт» указывает, что allowSubstitutable имеет значение true.

Так как я сам неправильно понял {contract} и сначала перепутал его с обычным ограничением, давайте уточним этот важный намек:

  • {contract} xxx означает, что параметр допускает замену параметра классификатором, имеющим тот же контракт, что и xxx. Это необходимо, когда параметр представляет собой класс, ограниченный определенными интерфейсами.
  • xxx (без {contract}) означает, что параметр должен быть xxx или его специализацией. Следовательно, это нельзя использовать для класса, который должен реализовать интерфейс, поскольку класс является реализацией интерфейса, а не специализацией.

В вашем случае параметр будет таким:

T : class > {contract} IModel NewConstraint

Но поскольку класс по умолчанию является типом параметра, его можно упростить до:

T > {contract} IModel NewConstraint
person Christophe    schedule 10.07.2021