| Association Specializations    [Previous]   [Next]    |  |       User Manual [Previous]  [Next] Association Specializations A specialization is a subset of duplicate associations where:  
 For example, consider the case of Vehicle and Wheel classes and an Optional One to Many association between them. A Wheel can only belong to one Vehicle, but the concept of a Vehicle can include any number of Wheels. Say, for instance, we wanted to create a new Bicycle class that extends Vehicle, but we would like to make use of the association that already exists with a stricter multiplicity (say, a Bicycle can have up to 2 Wheels). Without specializations, we need to create a new association between Bicycle and Wheel and thus generate some unneeded code and duplicate data fields (both Vehicle and Bicycle would have a list of Wheels, which behave more or less the same). With specializations, simply stating that we want a new association between Bicycle and Wheel (as long as the names match up to the Vehicle to Wheel association) is enough to generate more appropriate code. Example
// Here we define our base classes
class Vehicle {}
class Wheel {}
// Here we define our subclasses
class Bicycle { isA Vehicle; }
class Unicycle { isA Vehicle; }
// This is the "parent association" so to speak.
// It defines the Vehicle to Wheel relationship
// with as much abstraction as possible.
association {
  0..1 Vehicle -- 0..* Wheel vehicleWheel;
}
// Here, we'd like to extend the functionality of
// the previous association to work with
// subclasses of Vehicle, while utilizing as much
// of the existing code as possible.
// Specializations allow us to do this, since:
// -> Bicycle and Unicycle extend Vehicle;
// -> Wheel is part of the Wheel hierarchy;
// -> The bounds on the left are not less specific
//    than the left bound of the parent
//    association;
// -> The bounds on the right are not less
//    specific than the right bound of the parent
//    association;
// -> Finally, the role names are the same.
association
  { 0..1 Bicycle vehicle -- 0..2 Wheel vehicleWheel; }
association
  { 0..1 Unicycle vehicle -- 0..1 Wheel vehicleWheel; }
      Load the above code into UmpleOnline |