El favor ocurre cuando ambos candidatos califican. El problema planteado en la pregunta falla en esta cuenta, ya que solo tiene una opción de composición.
"La composición podría usar la generalización también". ¿Tiene sentido esta afirmación para nosotros? Si no es así, todavía no estamos listos para comprender la regla del 'favor'.
Por qué estamos a favor de la composición es que la composición ofrece más posibilidades de extensión / flexibilidad que la generalización. Esta extensión / flexibilidad se refiere principalmente a tiempo de ejecución / flexibilidad dinámica (que se logra con la combinación de interfaces y composición).
El beneficio no es inmediatamente visible. Para ver el beneficio, debe esperar la próxima solicitud de cambio inesperado. Entonces, en la mayoría de los casos, aquellos que se apegan a la generalización fallan en comparación con aquellos que adoptaron la composición (excepto un caso obvio mencionado más adelante). De ahí la regla. Desde el punto de vista del aprendizaje, si puede implementar una inyección de dependencia con éxito, entonces debe saber cuál favorecer y cuándo. La regla lo ayuda a tomar una decisión cuando no está seguro de cuál elegir. Una vez más, debería poder ver ambas opciones en primer lugar para favorecer una.
Resumen: Composición: el acoplamiento se reduce con solo tener algunas cosas más pequeñas que se conectan a algo más grande, y el objeto más grande simplemente llama al objeto más pequeño. Generlización: desde un punto de vista de API de terceros, definir que un método puede ser anulado es un compromiso más fuerte que definir que se puede llamar a un método (seguro ganar para la generalización). Y nunca olvide que con la composición también está utilizando la generalización, desde una interfaz en lugar de una gran clase. Pero todo el crédito va a la composición por desgracia.