"Composition over Inheritance" is a principle in object-oriented programming that suggests that, when designing a class hierarchy, it's often better to use composition (i.e. an object containing other objects) to achieve code reuse, rather than inheritance (i.e. a class extending another class).

The main advantage of composition over inheritance is that it allows for greater flexibility and less coupling between objects. With composition, objects can be composed together in different ways to create new functionality, without the need to create a whole new class hierarchy.

In contrast, inheritance can lead to tight coupling between classes, making it harder to change the implementation of a class without affecting the classes that inherit from it. Also, Inheritance can lead to a large number of classes that are hard to understand and maintain.

Here's an example that illustrates the difference between composition and inheritance. Let's say you're creating a game and you have a Player class and a Weapon class.

If you use inheritance, you might create a SwordPlayer class that inherits from Player and Sword class that inherits from Weapon. This creates a tight coupling between the classes, making it harder to change the implementation of the Player class without affecting the SwordPlayer class and vice versa.

On the other hand, if you use composition, you would create a Player class and a Weapon class, and the Player class would have a property that references an instance of the Weapon class. This allows for greater flexibility and less coupling between the classes, since the Player class can be composed with any type of weapon, without the need to create new classes.

In summary, "Composition over Inheritance" suggests that it's often better to use composition to achieve code reuse, rather than inheritance. Composition allows for greater flexibility and less coupling between objects, making it easier to change the implementation of a class without affecting other classes.