código heredado dado, el sistema tiene la siguiente jerarquía de clases:método de reemplazo para una familia de subclases
Base
^
|
----------+---------------
^ ^ ^ ^ ^
| | | | |
A1 B1 C1 D1 E1
^ ^ ^ ^ ^
| | | | |
A2 B2 C2 D2 E2
.......
^ ^ ^ ^ ^
| | | | |
An Bn Cn Dn En
La jerarquía representa los mensajes en un dominio específico.
La clase base es, por supuesto, la clase base de todos los mensajes. A1..E1 son mensajes que pertenecen a la versión 1 del dominio, A2..E2 a la versión 2, y así sucesivamente. Tenga en cuenta que An debe heredar directamente de An-1, ya que An anula los métodos específicos de An-1.
Hay alguna funcionalidad que es común a todos los mensajes, por lo que se define como Base :: PerformFunctionality. Alguna parte de la funcionalidad es específica de la versión n, por lo que existe la función virtual Base :: SpecificPartOfFunctionality, que se llama por Base :: PerformFunctionality.
Así que mi problema es cómo anular Base :: SpecificPartOfFunctionality específica por todos An..En.
veo 2 soluciones posibles, que no me gusta demasiado:
Implementar Base :: SpecificPartOfFunctionality en todos y cada uno An..En.
El problema con esta solución es que la implementación debe ser exactamente igual para cada clase, así que simplemente repito el código.
El problema adicional es que si se introduce una nueva clase Fn, el desarrollador puede olvidarse de implementar SpecificPartOfFunctionality específica.
Introducir BaseN se derivan de la clase base, mientras que cada uno An..En derivan de BaseN también:
class BaseN : public Base { //... SpecificPartOfFunctionality() { ...} }; class An: public An-1, public BaseN { .. }
El problema de esta solución es que introduce diamante problema.
problema adicional es lo que ocurrirá si alguna otra versión m necesita para anular Base :: SpecificPartOfFunctionality también. Siguiendo la solución presentaremos BaseM, que anulará Base :: SpecificPartOfFunctionality. Por lo cual SpecificPartOfFunctionality será llamado para Un - de BaseN o de BaseN. Es un completo desastre.
¿Alguna sugerencia?
¿Se le permite cambiar las clases A1..E1? Si es así, ¿por qué no implementar 'SpecificBase' que implementa' SpecificPartsOfFunctionality' de donde deriva A1..E1, en un esquema de herencia único. 'SpecificBase' deriva de' Base', por supuesto. – Constantinius
Se me permite cambiar A1 ... E1. Creo que estás describiendo la solución 2 propuesta por mí. – dimba
no exactamente, ya que está utilizando la herencia múltiple (hm ... su sintaxis parece incorrecta.) – Constantinius