2010-10-08 19 views
10

Uso interfaces/clases base abstractas para la mayoría de mis tipos y no suelen heredar de clases concretas, pero recientemente me encontré con una situación en la que se desea herencia o composición. He sido consciente del adagio "programa para una interfaz, no una implementación", pero recientemente decidí profundizar.¿Es malvada la herencia de las clases concretas?

que he visto argumentos againstinheritance, y he visto contador arguments pero tengo curiosidad en cuanto a lo demás encargados del mantenimiento de grandes bases de código realmente hacen en la vida real. Es el miedo exagerado? ¿Heredas de clases concretas, o son escépticos de la herencia correctos? Estoy particularmente interesado en escuchar a las personas que trabajan en C++.

+1

Más detalles ayudarían. Esto no es una verdadera pregunta. – Potatoswatter

+0

No, no es malo. Es solo que a menudo no es lo correcto. Sin más detalles, es difícil juzgar su caso. – jcoder

+0

La herencia es una herramienta, no es inherentemente buena o malvada, depende de cómo se use. –

Respuesta

11
No

a ++ tipo C (tienen experiencia profesional con los sistemas empresariales grandes en C#, Java y Ruby), pero aquí es mi 2 centavos de todos modos

Esto no es una cosa en blanco y negro.

El problema con la herencia es que introduce un acoplamiento hermético. Peor aún, ese acoplamiento generalmente está alrededor del estado encapsulado. Los cambios en las súper clases pueden tener efectos de ondulación en las jerarquías de herencia, creando errores sutiles y difíciles de predecir.

La segregación de la interfaz evita totalmente estos problemas, ya que no rompe la encapsulación de la misma manera.

Lo bueno de la herencia es que a veces tienes un modelo de objeto que realmente es lo mismo, solo con un pequeño cambio o adición. Siempre que ese cambio sea muy claro, no de amplio alcance, y no sea una restricción adicional (vea el problema circle-ellipse), la reutilización del código prevalecerá sobre el acoplamiento estricto.

Me atengo a la composición sobre la herencia como regla general, no como una ley.

+0

Oh hey. Solo un mano a mano, tu avatar es idéntico al de Mike Stone. De hecho, le pregunté al respecto, y él me dijo que él mismo hizo el avatar, caminando paso a paso a través del episodio en particular y en realidad editando manualmente el fondo. No creo que haya apreciado a la gente rompiendo su avatar, tampoco. :-( –

+0

@Chris: Oh mierda.De hecho, me lo arranqué de un amigo avatar de MSN (que no es mike stone, e irónicamente no tuve ningún problema con el uso), pensé que acaba de obtenerlo de una búsqueda en Google. Lo cambiaré lo antes posible. –

+1

@Chris: obtuve un alevín volando a su scootie-puff junior de algún sitio de avatar aleatorio, debería cambiar cada vez que SO caduque sus cachés. ¿Cuáles son las probabilidades de que algo que obtienes a través de msn resulte ser el producto amorosamente elaborado de un usuario activo real de un foro en el que estás activo? –

4

Puede obtener privadamente de clases concretas. La herencia privada no requiere la sustituibilidad de Liskov; es esencialmente solo una manera conveniente de "mezclar" la funcionalidad de una clase.

La herencia pública, por otro lado, sí requiere la capacidad de sustitución de Liskov. Entonces, generalmente, heredar públicamente clases concretas es algo malo, a menos que dicha clase esté diseñada para ser utilizada como una clase base (muchas no lo son).

+0

Muchos que no están diseñados pueden rediseñarse/refinarse un poco para admitirlo también. – Potatoswatter

2

El buen diseño estipula que las clases concretas deberían hacer una sola cosa, relativamente pequeña, bien y de manera eficiente. Especialmente en C++, las clases concretas enfatizan su similitud con tipos de hormigón como int y char, a menudo por sobrecarga del operador y por tener solo funciones no virtuales. Como las clases concretas no pretenden mostrar un comportamiento polimórfico, no deberían heredarse. Consulte también la sección 25.2 de The C++ Programming Language para obtener más información sobre el uso adecuado de los tipos de concreto en ese idioma.

Cuestiones relacionadas