Короче:
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