Buenas, tengo una duda respecto a cuándo hacer redefinicion de un metodo delegado de la clase madre a las hijas y cuando usar metodo abstracto, es decir dejarlo abstracto en la madre y definirlo en las hijas. Hay alguna regla o alguna razon por la que sea preferente una de las dos? En realidad es minimo lo que cambia la implementacion de una derivada a otra pero es necesario que haga alguna de estas dos cosas y no tengo un criterio para decidir cuál.
Desde ya gracias
Carolina
Hola Carolina:
Como siempre este tipo de cuestiones son relativas y dependen de muchas otras consideraciones. Siempre hay que analizar las ventajas y desventajas de cada posibilidad desde el punto de vista de diseño y el criterio que debemos tomar para que el diseño sea orientado a objetos es que el acoplamiento sea el menor posible y que el modelo sea lo más fácilmente extensible posible.
En la clase de ayer justamente estuvimos debatiendo sobre esto y creo que no terminó de quedar claro. Analizamos el ejemplo de la biblioteca que compartí en el foro de anuncios en donde tenemos miembros comunes y miembros premium (cuya membresía dura más tiempo). Una alternativa era crear una clase abstracta Miembro de la cual hereden las clases MiembroComun y MiembroPremium. A otros se les ocurrió hacer que la clase Miembro sea concreta y tenga la responsabilidad de un miembro común y que la clase MiembroPremium herede de ella y redefina el método con el comportamiento distinto. La ventaja de esta última alternativa es solamente que se tiene una clase menos. La redifición de métodos es una práctica habitual en algunos casos pero lo que hace más ruido quizás es heredar de una clase concreta. De esa manera se tiene que las clases Miembro y MiembroPremium están muy acopladas, es decir, MiembroPremium tiene que saber sí o sí de la existencia de la clase Miembro que tiene el comportamiento de un miembro común. En la primera alternativa, en cambio, MiembroComún y MiembroPremium no se conocían y eran completamente independientes, de manera tal que el diseño es más extensible en el futuro (si quisiera agregar un nuevo tipo de miembro simplemente debería crear una nueva clase que herede de la clase abstracta Miembro).
Esto también llevó al debate de qué tan necesario es diseñar un modelo que prevea cualquier extensión futura. A veces pensar tanto en posibles extensiones complica innecesariamente al modelo y basta con una solución más simple. En estos ejemplos tan sencillos mucha diferencia no hace porque se puede refactorizar fácilmente en cualquier caso pero yo me inclino más a heredar preferentemente de una clase abstracta en la mayoría de los casos.
Saludos,
Tomás