2.2 Type Hierarchy and Inheritance Roles and classes are organized in separate hierarchies. These hierarchies are interconnected by the supports relationship, defining the instances of which classes can play which roles. However, only class hierarchies are the natural realm of inheritance: the genes of a class (its implementation) are propagated from the general to the special. This regards not only the observables, but also and more characteristically the internals: inheritance is inherently genetic. Roles, on the other hand, make no assumptions about how a certain piece of functionality is achieved. Quite the reverse: roles explicitly leave it open instances of which natural types they are played by, allowing for genetically (i.e., in terms of inheritance) unrelated instances taking the same role. In a role hierarchy, only protocol is handed down from superrole to subrole. 2.3 Intension and Extension of Types The intension of a class is its definition. The extension of a class is the set of its instances. While the intension of a class in JAVA is static, i.e., cannot change at runtime, its extension “breaths”: it grows and shrinks in response to instance creation and disposal. It is therefore useful to distinguish between a static and a dynamic extension, the static extension of a class being the set of all instances of that class that can possibly exist, the dynamic extension being the set of instances existing at a certain moment in time (in a snapshot or state of the software system). Quite obviously, the dynamic extension of a class is always a subset of its static extension. As regards the class hierarchy, the extension of a class comprises the extensions of all its subclasses, both statically and dynamically. Like that of a class, the intension of a role is its definition. However, unlike classes, roles have no instances of their own (they are abstract in a sense), they must recruit them from the classes supporting them. Like that of an abstract class, the static extension of a role is defined as the union of the static extensions of all the classes supporting it. This expresses that all instances of a supporting class are — in principle at least — capable of playing the role. The dynamic extension of a role, however, is usually only a subset of the dynamic extensions of the classes supporting it, namely the set of instances actually playing the role at that time.4 portant point: an object can play many different roles simultaneously, and this without ever giving up its natural type. But even if dynamic reclassification came in concert with multiple classification (allowing an object to be an instance of different classes at the same time), it would still lack the relationship aspect as one defining characteristic for the role concept. Instance migration is a concept for dynamic reclassification as a response to significant state changes; as will be seen, it is unnecessary to cater for roles. 4 That the dynamic extension of a role is only a subset of the dynamic extensions of the supporting classes is often erroneously interpreted as indication that a role is a subtype of the roleplaying class(es), which is wrong because statically they are not: all instances of a class supporting a role can, in principle, play the role, or they are not of the same type. That the dynamic extension of roles depends on the dynamic extensions of relationships is grounded in the ontological foundation of the concept, as detailed above.
Playing the role in this setting means that the instance is actually involved in a relationship, in that role. In programming terms being involved in a relationship means being assigned to a variable, be it an instance variable or a formal parameter. Transferred to JAVA programming, the dynamic extension of an interface is the set of instances assigned to variables typed by that interface. 3. THE PRAGMATICS OF USING INTERFACES While we agree that interfaces should be used extensively in variable declarations, extensively does not mean exclusively. A good question to ask is therefore when to use interfaces and, equally important, when not to. A simple test to decide whether or not to use an interface in the declaration of a variable is to refer to the conceptualization of interfaces, roles. Does the relationship represented by the variable give rise to the definition of a role? Does this role come with specific behaviour, or is it just a label that could be applied to any object? We shed light on a few typical cases. Qualities Many variables hold qualities of an object, for instance weight, height, or age. Conceptually, the values (in the given example all numbers) play the “roles” Weight, Height, and Age, respectively. However, these roles are special in that the relationships they are defined by confine the natural type of the role players: they must be numbers. It is therefore