Model Xtractor can represent efficiently not only template definitions, but also template substitutions, which are virtual generic types, similar to template constructs, “derived” from the same template definition, but using different generic parameter names or types. Each template substitution is “linked” to its template definition shape through the special auto-expanded <<template>> dependency item. For each generic parameter that can be represented by a shape, Model Xtractor also generates a <<param>> dependency item.
Template Definitions and Substitutions
While most languages today (C++, Java, C#) use the <..> notation for generics or templates, we’ve seen no need to adopt the different shape representation required by UML. A Dictionary<TKey, TValue> generic class will have the same title in Model Xtractor as in C#, C++ etc.
Dictionary<TKey,TValue> implements IDictionary<TKey,TValue>, which inherits from ICollection<KeyValuePair<TKey,TValue>>. This .NET dictionary is in fact a collection of KeyValuePair objects. There is no template definition with such parameters for the last interface. The actual definition is only for ICollection<T>, where the generic T parameter has been substituted with KeyValuePair<TKey,TValue>. ICollection<KeyValuePair<TKey,TValue>> will contain two template-related dependency items, automatically added by Model Xtractor and expanded in the diagram:
- <<template>> –> ICollection<T>, which defines our interface as a template substitution (similar to an open construct in C#/.NET) of a well-defined generic type. The expanded item connector looks like the generalization connector, but the big triangle is filled-in with black.
- <<param>> –> KeyValuePair<TKey,TValue>, which is a parameter substitution. The expanded item connector looks like the dependency connector, but with a big arrow.
The diagram contains other template and param expanded items, easily identified now as such. All highlighted shapes are template substitutions.
Template Parameter Substitutions
Model Xtractor internally and dynamically creates a template substitution type each time a parameter list is different from the original template definition. It is enough to see a different generic parameter name, even if the whole signature is actually the same. Main difference from a C# template construct is the compile actually generates a new class each time it’s based on a template.
Model Xtractor automatically creates a parameter substitution for any combined generic parameter from which we can further navigate to a type-based shape. This was the case for KeyValuePair<TKey,TValue> in the previous diagram, but not for any template below. T, TKey or TValue alone are just simple names, from which we cannot generate shapes.
Both ValueCollection and KeyCollection, nested types of Dictionary<TKey,TValue>, implement essentially the same generic ICollection<T> interface. However, Model Xtractor has to generate two different template substitutions (highlighted shapes), because one is a collection of TKey, the other of TValue. T, TValue or TKey are just symbolic names, but we need to see them as such in the diagram.




Leave a Comment