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