Composition is a fundamental concept in object-oriented programming that allows developers to create complex objects by combining simpler ones. In Kotlin, composition provides a flexible alternative to inheritance, promoting code reuse and modularity.
Composition involves creating relationships between classes where one class contains instances of other classes as properties. This "has-a" relationship is different from the "is-a" relationship established through Kotlin Inheritance.
To implement composition, you define properties in a class that are instances of other classes. Here's a simple example:
class Engine {
fun start() {
println("Engine started")
}
}
class Car {
private val engine = Engine()
fun start() {
engine.start()
println("Car is ready to go!")
}
}
fun main() {
val myCar = Car()
myCar.start()
}
In this example, the Car
class has a composition relationship with the Engine
class. The car "has-an" engine, rather than "is-an" engine.
While both composition and inheritance promote code reuse, composition often provides more flexibility. It allows you to change the behavior of a class at runtime by swapping out composed objects.
interface Powertrain {
fun start()
}
class ElectricMotor : Powertrain {
override fun start() {
println("Electric motor humming")
}
}
class GasEngine : Powertrain {
override fun start() {
println("Gas engine roaring")
}
}
class Vehicle(private val powertrain: Powertrain) {
fun start() {
powertrain.start()
println("Vehicle is ready!")
}
}
fun main() {
val electricCar = Vehicle(ElectricMotor())
electricCar.start()
val gasCar = Vehicle(GasEngine())
gasCar.start()
}
This example demonstrates how composition allows for more flexible designs. The Vehicle
class can work with different types of powertrains without changing its implementation.
Composition is a powerful technique in Kotlin that enables developers to create flexible and maintainable object-oriented designs. By understanding and applying composition, you can build more modular and adaptable software systems.
Remember to consider composition as an alternative to inheritance when designing your Kotlin classes. It often leads to more loosely coupled and easily testable code.