## 3. Intension versus Extension

The **intension** of an object type is given by the set of its features, including attributes, associations, constraints and operations.

The **extension** of an object type is the set of all objects instantiating the object type. The extension of an object type is also called its population.

We have the following duality: while all features of a supertype are included in the intensions, or feature sets, of its subtypes (intensional inclusion), all instances of a subtype are included in the extensions, or instance sets, of its supertypes (extensional inclusion). This formal structure has been investigated in formal concept analysis.

Due to the intension/extension duality we can specialize a given type in two different ways:

By **extending the type's intension** through adding features in the new subtype (such as adding the attribute `subjectArea`

in the subtype `TextBook`

).

By **restricting the type's extension** through adding a constraint (such as defining a subtype `MathTextBook`

as a `TextBook`

where the attribute `subjectArea`

has the specific value "Mathematics").

Typical OO programming languages, such as Java and C#, only support the first possibility (specializing a given type by extending its intension), while XML Schema and SQL99 also support the second possibility (specializing a given type by restricting its extension).