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