Este artículo explica los peligros de la herencia, y ofrece una solución ...
En este artículo voy a tener que utilizar algunos nombres ficticios de clase, etc debido a la sensibilidad del proyecto estoy trabajando, por lo que llevar conmigo si alguna de la información parece un poco extraño.
Después de trabajar yo mismo alrededor de 6 niveles de profundidad en la herencia de repente me di cuenta de que la fábrica de mi clase había un DateOfBirth. Esta es sin duda deseable, pero con mi actual modelo no podía hacer nada al respecto. Mis opciones para deshacerse de la herencia de la fábrica y perder todos los beneficios de hacerlo (tener "AdditionalInformation" definibles por el usuario, por ejemplo), o hacer caso omiso de la DateOfBirth y no se mostrará en el GUI.
Ambas opciones son basura. En vez de tomar uno de ellos, me fui para una opción completamente diferente lugar. He decidido eliminar casi todos dentro de la herencia de mi modelo, y agregar compuestos lugar las relaciones.
Ahora, en lugar de la fábrica de mi clase descendente indirectamente de un ObjectWithAdditionalInformation no tiene ninguna clase ancestro en absoluto. A fin de lograr la misma funcionalidad ahora tengo una relación de la fábrica a la ahora rebautizada AdditionalInformationHolder clase. Esta clase tiene la información adicional el usuario quiere entrar, y la fábrica crea una instancia de la misma cuando se creó.
Entonces creó un marco / UserControl que se celebrará el GUI para introducir información adicional, incluido el suyo propio ExpressionHandle.
La belleza de este enfoque es que ahora pueden tener cualquier tipo de objeto dentro de mi modelo de poder disponer de información adicional registrada en contra de ella si así lo desean. Para la aplicación de la GUI, simplemente deje caer el Marco / UserControl en la forma del objeto en cuestión y establecer el contexto raíz de la ExpressionHandle.
De repente tengo un modelo con casi ninguna herencia en ella en absoluto. Puedo hacer modificaciones a las clases sin tener que comprobar que costumbre romper cualquiera de los descendientes de las clases (o sus formas), y no he perdido toda la funcionalidad en absoluto.
Recomiendo encarecidamente que utilice la herencia sólo para el polimorfismo beneficios, no sólo por el bien de heredar propiedades. Sólo se debe usar cuando se trata de una elegante solución a un problema (como la descrita en mi artículoComposición y recursivo OCL) más que como una forma de evitar tener que entrar en los mismos atributos / comportamiento en una nueva clase. Recuerde, sólo porque un edificio y una persona tienen un nombre, una fecha de la concepción, y un lugar, no " No hacen la misma cosa!

Delicious
Digg
Google
Yahoo