Composición y herencia.¿Hay algo que la composición no pueda lograr que la herencia pueda?
Soy consciente de que ambas son herramientas para elegir cuando corresponda, y el contexto es muy importante al elegir entre composición y herencia. Sin embargo, la discusión sobre el contexto apropiado para cada uno suele ser un poco confusa; esto me hace comenzar a considerar cuán claramente la herencia y el polimorfismo son aspectos separados de la POO tradicional.
El polimorfismo permite especificar las relaciones "is-a" de la misma manera que la herencia. Particularmente, heredar de una clase base implícitamente crea una relación polimórfica entre esa clase y sus subclases. Sin embargo, mientras que el polimorfismo se puede implementar utilizando interfaces puras, la herencia complica la relación polimórfica transfiriendo simultáneamente los detalles de implementación. De esta manera, la herencia es bastante distinta del polimorfismo puro.
Como herramienta, la herencia sirve programadores de manera diferente que el polimorfismo (a través de interfaces de puros), simplificando la implementación reutilización en casos triviales. Sin embargo, en la mayoría de los casos, los detalles de implementación de una superclase entran en conflicto sutilmente con los requisitos de una subclase. Es por eso que tenemos "reemplazos" y "miembros que se esconden". En estos casos, la reutilización de implementación ofrecida por herencia se compra con el esfuerzo adicional de verificar los cambios de estado y las rutas de ejecución a través de niveles de código en cascada: los detalles completos de implementación de la subclase se reparten entre varias clases, lo que generalmente significa archivos múltiples, de los cuales solo porciones se aplican a la subclase en cuestión. Mirar a través de esa jerarquía es absolutamente necesario cuando se trata de herencia, ya que sin mirar el código de la superclase, no hay forma de saber qué detalles sin justificación están alterando su estado o desviando su ejecución.
En comparación, el uso exclusivo de la composición garantiza que verá qué estado puede ser modificado por objetos explícitamente instanciados cuyos métodos se invocan a su criterio. La implementación realmente plana aún no se logra (y en realidad ni siquiera es deseable, ya que el beneficio de la programación estructurada es la encapsulación y abstracción de los detalles de implementación) pero aún así obtienes la reutilización de código, y solo tendrás que mirar en un solo lugar cuando el código se comporta mal
Con el objetivo de poner a prueba estas ideas en la práctica, dejando de lado la herencia tradicional para una combinación de polimorfismo basado en interfaz pura y composición de objetos, me pregunto,
¿Existe composición de objetos nada y las interfaces no pueden lograr eso puede herencia ?
Editar
En las respuestas hasta ahora, ewernli cree que no hay proezas técnicas disponibles para una técnica pero no la otra; luego menciona cómo diferentes patrones y enfoques de diseño son inherentes a cada técnica. Esto es razonable. Sin embargo, la sugerencia me lleva a refinar mi pregunta al preguntar si el uso exclusivo de la composición y las interfaces en lugar de la herencia tradicional prohibiría el uso de cualquier patrón de diseño importante. Y si es así, ¿no hay patrones equivalentes para usar en mi situación?
Personalmente, me gusta mezclar. :) –
No tengo tiempo para verificar la duplicación efectiva, pero este tema de herencia v. Composición se visita periódicamente en SO, por ej. http://stackoverflow.com/questions/216523/object-oriented-best-practices-inheritance-v-composition-v-interfaces or http://stackoverflow.com/questions/1598722/should-i-use-inheritance -o-composición. "Uno siempre puede darle un giro a este tema y llamarlo una nueva visión de las cosas ..." Sin embargo, una cosa en la que deberíamos estar de acuerdo es que este tipo de preguntas no conducen a respuestas definitivas o incluso autorizadas. Tal vez un CW sea el formato más apropiado ... – mjv
No quise repetir un debate cansado. Es cierto que la forma en que expuse mi caso fue más bien una muestra unilateral de dicho debate, pero mi principal interés es responder si hay o no un uso para la herencia que realmente no puede ser reemplazado por composición e interfaces. p.s., ¿qué es un formato CW? Tal vez lo intente ... –