General about Class Relationships
Classes have different relations among each other. Basically we need to look at 4 parameters to determine which relation we are dealing with.
Part/Whole
Is one class a part of the other? So is it essential for one class that the other one exist?
Destructive/non-destructive behavior
If you destroy one class, is the other class also destroyed?
Inheritance
Is one class derived from another class?
Interaction
In which way are the classes interacting with each other?
Association, Dependency, Composition, Aggregation, Inheritance
Association
One Class has a reference to another class, they both are equal in their rank. In this example Student has 1..* references to Coffee.
Dependency
Is very similar to Association but in this case we just use a part of the API (set of available methods) instead of the whole class.
Composition
The composition is the most used relationship, in case of a composition, one class is part of the other class and will be destroyed if the “parent” is destroyed.
Aggregation
One class is part of another class but will not be destroyed if the parent is destroyed.
Inheritance
One class is derived from another class, meaning that the properties (members) and methods are also available for the derived class.
From that we can set up the following table:
The problem with our point of view
The problem is that we as humans tend to bring classes into relations we would expect in a natural environment but this is only limited suitable for a technical implementation.
In a technical implementation we need to decide where and how the relationships are established. We can establish relationships by making classes members, point to other classes, invoke them etc. So its not sufficient to have a look at the class name but also at its attributes and methods.
Members and Pointers
So if we have a member which is another class then we have a composition because if the “parent” is destroyed, all members will also be destroyed. But how about pointers? If we point to another object and destroy the parent then just the address is lost. This would be a Aggregation in this case, but if we implement within the destructor that we also want to delete the object we are pointing to then this would be a composition. So a pointer to another class does not necessarily mean that that this is an Aggregation, it also might be an Composition but this is dependant on your implementation.