## 3. Intension versus Extension

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

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).