Understanding Class Interactions: Association, Aggregation, Composition

Paul Tesfaye
3 min readOct 11, 2023

--

Introduction

In object-oriented programming, class interactions are essential for modeling relationships between classes or models. These interactions define how objects collaborate and interact with each other to achieve specific functionalities. In this article, we will explore three fundamental types of class interactions: Association, Aggregation, and Composition. Additionally, we will briefly touch upon other types of interactions. Through easy-to-understand examples in JavaScript and Python, we will gain a clear understanding of these concepts.

1. Association:

Association is a relationship between two classes where objects of one class are connected to objects of another class. It’s like having a connection or link between two things. Think of it as a relationship where one thing can be associated with another thing, but they can still exist independently. For example, a car can be associated with a driver, but the driver can exist without being tied to a specific car.

Example in JavaScript:

class Car {
constructor() {
this.driver = null;
}
}

class Driver {
constructor(name) {
this.name = name;
}
}

const car = new Car();
const driver = new Driver("John");
car.driver = driver;

Example in Python:

class Car:
def __init__(self):
self.driver = None

class Driver:
def __init__(self, name):
self.name = name

car = Car()
driver = Driver("John")
car.driver = driverp

2. Aggregation:

Aggregation is a special type of association that represents a “has-a” relationship between classes. It’s a way of saying that one class contains or has other objects as its parts. In aggregation, the parts can exist independently, even if the whole object is destroyed. It’s like a container holding objects inside it. For example, a university can have departments, and each department can exist on its own, even if the university is not there anymore.

Example in JavaScript:

class University {
constructor() {
this.departments = [];
}

addDepartment(department) {
this.departments.push(department);
}
}

class Department {
constructor(name) {
this.name = name;
}
}

const university = new University();
const department = new Department("Computer Science");
university.addDepartment(department);

Example in Python:

class University:
def __init__(self):
self.departments = []

def add_department(self, department):
self.departments.append(department)

class Department:
def __init__(self, name):
self.name = name

university = University()
department = Department("Computer Science")
university.add_department(department)

3. Composition:

Composition is a stronger form of aggregation. It also represents a “has-a” relationship, but in this case, the parts cannot exist independently of the whole object. The parts are tightly coupled with the whole and cannot survive without it. It’s like building something using smaller components that are inseparable from the final product. For example, a house is composed of rooms. If the house is destroyed, the rooms cease to exist as well.

Example in Javascript:

class House {
constructor() {
this.rooms = [
new Room("Living Room"),
new Room("Bedroom"),
new Room("Kitchen")
];
}
}

class Room {
constructor(name) {
this.name = name;
}
}

const house = new House();

Example in Python:

class House:
def __init__(self):
self.rooms = [
Room("Living Room"),
Room("Bedroom"),
Room("Kitchen")
]

class Room:
def __init__(self, name):
self.name = name

house = House()

To summarize:

  • Association: It’s a connection or link between two classes, where they can exist independently.
  • Aggregation: It’s a “has-a” relationship, where one class contains other objects as parts, and the parts can exist independently.
  • Composition: It’s a stronger “has-a” relationship, where the parts are tightly tied to the whole and cannot exist independently.

These concepts help us understand how different classes or objects relate to each other, allowing us to design flexible and modular systems.

Conclusion:

Understanding class interactions is vital for designing effective object-oriented systems. We explored three essential types of interactions: Association, Aggregation, and Composition, with clear examples in JavaScript and Python. Additionally, we briefly touched upon Inheritance and Dependency as other types of class interactions. Now armed with this knowledge, you can confidently model relationships between classes and create well-structured and maintainable code.

--

--