La herencia simple
Es la que tienen
todos los lenguajes orientados a objetos: heredamos los atributos de una sola
clase padre, lo cual nos permite reutilizar código. Si fuera herencia múltiple,
podríamos heredar de más de un padre.
Ejemplo de como se
codificaría
La herencia
múltiple, si fuera implementada en PHP, se codificaría de la siguiente manera:
class C extends A,B{
// código
}
Donde la clase C
hereda atributos y/o métodos de dos clases, A y B.
Por ejemplo, la
clase "HombreLobo" puede heredar de la clase "Hombre" y de
la clase "Lobo", pero el problema es que se pueden hacer tantas
combinaciones que será difícil seguir y mantener un diseño de este tipo. Por
eso muchos lenguajes no la implementan, no por un tema técnico, solo por un
tema de salvaguardar la integridad del diseño.
¿Se puede hacer o no?
Por lo que he visto
en varios lenguajes, la discusión legítima no es "si se puede hacer o
no". En muchos casos no se implementa (como en Java, PHP, etc) porque
habilitarla es un posible camino al desastre.
Verdaderamente no
es problema técnico, o de evolución, es un problema de criterios de diseño
"OO".
Herencia múltiple a
través de interfaces
De todas formas
siempre hay una puerta trasera: hacer herencia múltiple a través de interfaces;
pero el sentido es distinto a hacerlo con clases. Las herencias de clases
definen el "que son" y las interfaces agrupan clases que definen el
"que hacen".
Las interfaces
permiten pasar del estilo de diseño "orientado a la implementación" a
uno "orientado a la interfaz", donde todas las clases acceden a
servicios a través de interfaces que son implementadas por clases concretas. Y
al no depender de clases concretas (solo de entidades abstractas) nuestro
diseño será más reutilizable que el anterior.
El mayor problema
Los problemas más
comunes que puede dar la implementación de herencias múltiples son las
"colisiones de nombres" y la "herencia repetida".
Las colisiones se
pueden dar cuando las clases empiezan a tener los mismos nombres en los métodos
generando la duda de cual método debo usar de las dos clases y la herencia
repetida es cuando nuestra clase hereda de dos clases que a sus vez son hijas
del mismo padre, por lo cual estemos posiblemente heredando características
repetidas.
¿Que sugieren las
"Guias de Diseño OO"?
Y ya que estamos
del tema "diseño", lo comento: las guías de diseño recomiendan que
para una buena jerarquía de herencia:
- Se deben tener no
más de 7 (+-2) niveles
- Las jerarquías
"gordas y bajas" son síntoma de "poca especialización"
- Las jerarquías
"altas y flacas" son síntoma de "excesiva especialización".
¿Si tantas
recomendaciones existen para la herencia simple, que queda esperar para la
herencia múltiple?
¿Y los grandes
libros de Patrones de Diseño?
Hasta yo puedo
crear un patrón y usar la herencia múltiple, pero eso no quiere decir que sea
la mejor solución a un problema, ni que este pueda aplicarse en otros contextos
(la esencia de los patrones).
Tomando como
referencia un libro base reconocido mundialmente como es el GOF , donde ninguno
de los patrones (de los 23) hacen uso de la herencia múltiple, y tampoco la
sugieren, y menos, se quejan de su falta.
Los patrones de
diseño son considerados la mejor "receta de cocina" para resolver un
problema recurrente, con el mejor diseño posible, donde puede ser aplicado en
otros contextos (concepto de patrón: "elemento reutilizable de experiencia
y conocimiento").
0 comentarios:
Publicar un comentario