[Madrid-pm] Herencia múltiple y constructores "tipo Conway"

DervishD bugs en dervishd.net
Vie Jun 1 02:16:12 PDT 2007


    Hola :)

    Quería comentaros una cosa porque estoy un poco dormido y creo que
se me está escapando algo.

    Os pongo en situación: capítulo 16, página 376 del "Perl Best
Practices" de Conway. Dice basicamente que lo mejor para construir es un
constructor especial e instalarlo en la clase UNIVERSAL. Esto evita
problemas relativamente graves en la herencia múltiple, porque si
hacemos "SUPER::new" sólo invocaremos UN constructor, no todos los
correspondientes a todos los padres. Si encima no usamos objetos
"inside-out", el lío es digno de mención y los problemas ni os digo.

    La cosa es que a mí se me ocurre una solución más simple, cuya única
desventaja es que si no te acuerdas de añadir cierto código a tu
constructor, no funciona. La solución de Conway funciona SIEMPRE, y ahí
me quito el sombrero, pero obliga a modificar el "new" de UNIVERSAL y
eso me hace sentir raro.

    La solución que propongo es algo como esto:

    package DUMMY;
    use base qw( ClaseA ClaseB ClaseC ); # En el futuro se pueden añadir
                                         # más clases
    sub new {
        ...  # Código variado que haga falta en el constructor

        foreach my $parent (@ISA) {
            $parent->new if $parent->can('new');
        }

        ... # Más código que haga falta en el constructor
    }

    El destructor es similar.

    Vale, mi solución sólo funciona si pones esa línea, pero funciona
con todo tipo de clases, incluso si los padres no siguen este método (en
ese sentido es como la solución de Conway), no es tan intrusiva como la
de Conway (no sé, sigue sin seducirme la idea de meter métodos tan
importantes como 'new' en UNIVERSAL) y no requiere que cambies la
notación de tu clase de usar subrutinas como "new" y "DESTROY" a "BUILD"
y "DEMOLISH" respectivamente, no necesita "no strict 'refs'" (aunque eso
es un mal menor, total son 10 líneas de código el constructor de Conway)
y no requiere investigar la tabla de símbolos de las clases (que no sé
por qué Conway no hace simplemente "can('BUILD')", se me escapa).

    ¿Qué opináis? ¿Qué cosa obvia se me está escapando con mi solución?
¿Cuánto son 400 dracmas?

    Raúl Núñez de Arenas Coronado

-- 
Linux Registered User 88736 | http://www.dervishd.net
It's my PC and I'll cry if I want to... RAmen!


Más información sobre la lista de distribución Madrid-pm