La composición sobre la herencia es una metodología de programación que se utiliza en los lenguajes de programación orientados a objetos para ayudar a establecer relaciones más dinámicas y cambiantes entre los objetos de una aplicación. El formato básico para la composición sobre la herencia es la inclusión de una instancia de un objeto dentro de otro objeto. Esto es claramente diferente del método de herencia orientado a objetos, pero puede tener el mismo propósito en muchos modelos. Las ventajas de la composición sobre la herencia incluyen bordes bien definidos entre los objetos compuestos y los objetos de envoltura, la capacidad de cambiar la implementación de un objeto sin afectar una jerarquía de herencia completa y un marco menos restrictivo para el diseño inicial del programa. Algunas de las complicaciones, sin embargo, podrían incluir dificultad en la serialización y estructuras demasiado complejas en programas grandes y establecidos.
En la programación orientada a objetos, una de las características que es importante establecer durante el diseño es cómo se relacionan los diferentes objetos entre sí. La herencia es un mecanismo central en la programación orientada a objetos y permite que un objeto herede todos los datos y métodos de su padre, que luego puede agregar, modificar o extender con su propia implementación. Un ejemplo de diseño basado en la herencia podría ser con un programa que tiene una clase principal que define un automóvil y modela algunos atributos genéricos de todos los automóviles. La clase para cada marca individual de automóvil se crea como descendiente de la clase principal, pero define información específica, como el tamaño del motor, la capacidad de combustible u otra información específica para esa marca particular de automóvil.
La composición se expresa incluyendo instancias de objetos dentro de otros objetos. Si hay una clase principal que define un automóvil genérico, en lugar de crear subclases para marcas de automóviles específicas, la clase principal podría contener instancias de otros objetos que definan el automóvil de manera más específica. Esto podría significar que la clase de automóvil principal podría contener un objeto para el tipo de motor y uno para la capacidad de combustible, que se establecería cuando la clase se use para crear una instancia de una marca específica de automóvil.
Con la composición sobre la herencia, los objetos que están contenidos en la clase principal no están directamente relacionados con la clase principal, dando a los desarrolladores la libertad de cambiar cómo funcionan los objetos individuales. Un problema que la composición sobre la herencia puede ayudar a prevenir es una situación en la que un árbol de herencia puede ser excesivamente profundo, lo que significa que cualquier modificación a una clase en el árbol podría requerir cambios a lo largo del árbol. No todos los lenguajes orientados a objetos admiten múltiples herencias, y la composición sobre la herencia es un método que se puede utilizar para evitar esta restricción.