Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre algo muy particular que no todos los lenguajes poseen.

Anuncios

La herencia multiple es como su nombre lo indica, la capacidad que tiene una clase para heredar los elementos de varias clases bases al mismo tiempo y no por herencia de los padres de esta, para citar un par de ejemplos:

  • C y C++ permiten la herencia de mas de una clase
  • Java no lo permite directamente pero si a traves de interfaces
  • C# tampoco lo permite directamente, por algo le dicen el Java de Micro$oft 😉
Anuncios
Anuncios

Y estos son solo algunos, muchos otros lenguajes no lo tienen implementado, otros no directamente como en el caso de los «Javas» y algunos si te lo permiten, pero para que nos puede ser util? Por ejemplo, nosotros podemos tener dos clases que hacen dos operaciones distintas pero que ambas pueden ser utilizadas para tener poder trabajar en un nuevo elemento y en lugar de tener que usar el codigo de ambas dentro de esta la hacemos heredera de ambas y que utilice las operaciones necesarias, esto no solamente nos ahorra codigo sino que utiliza el paradigma principal de todo lenguaje como es la reutilizacion, para entender el concepto vamos a crear el siguiente ejemplo:

>>> class Forma:
...     tipo_geometrico = 'Forma Generica'
...     def area(self):
...             raise NotImplementedError
...     def get_tipo_geometrico(self):
...             return self.tipo_geometrico
... 
>>> class Trazador:
...     def trazar(self, ratio, izqsuperior):
...             print('Trazando en {}, ratio {}.'.format(
...                     izqsuperior, ratio))
... 
>>>
Anuncios

Estas dos clases se encargaran de establecer la forma, donde tenemos un valor generico para el tipo, despues tiene la funcion para calcular el area pero en realidad solo devuelve una excepcion y despues una funcion para devolvernos el valor almacenado en tipo_geometrico, en todos los casos utilizamos a self para que trabaje para su instancia correspondiente, ahora vamos a crear la siguiente clase:

>>> class Poligono(Forma, Trazador):
...     tipo_geometrico = 'Poligono'
... 
>>>
Anuncios

Esta sera la clase base para nuestros poligonos pero si observan recibio dos clase bases como herencia, observen que simplemente deben pasar todas las clases que sean necesarias dentro de los parentesis, dentro de la clase redefinimos a tipo_geometrico con un nuevo valor, con nuestra clase base vamos a crear a su hija directa:

>>> class PoligonoComun(Poligono):
...     tipo_geometrico = 'Poligono Comun'
...     def __init__(self, lado):
...             self.lado = lado
... 
>>>
Anuncios

Esta sera una heredera de la clase anterior, donde redefiniremos el valor de tipo_geometrico e iniciaremos una variable llamada lado, esta a su vez sera clase base de las siguientes dos clases:

>>> class HexagonoComun(PoligonoComun):
...     tipo_geometrico = 'Hexagono Comun'
...     def area(self):
...             return 1.5 * (3 ** .5 * self.lado ** 2)
... 
>>> class Cuadrado(PoligonoComun):
...     tipo_geometrico = 'Cuadrado'
...     def area(self):
...             return self.lado * self.lado
... 
>>>
Anuncios

En este caso primero crearemos una clase para un hexagono, donde informaremos el tipo y calcularemos su area, despues tenemos otra clase para un cuadrado donde hacemos lo mismo a la clase anterior y como pueden ver estas son hijas de PoligonoComun, con esto ya tenemos nuestra cadena de herencias, vamos a probar como funciona primero mediante la creacion de un objeto de tipo hexagono:

>>> hexagono = HexagonoComun(10)
Anuncios

Nuestro siguiente paso sera verificar si podemos acceder a todos los elementos de las clases padres, usemos el siguiente codigo:

>>> print(hexagono.area())
259.8076211353316
>>> print(hexagono.get_tipo_geometrico())
Hexagono Comun
>>> hexagono.trazar(0.8, (75, 77))
Trazando en (75, 77), ratio 0.8.
>>>
Anuncios

Vemos como pudimos calcular el area y ver el tipo de figura que es, metodo y propiedades de nuestra clase pero tambien pudimos trazar que es una clase que viene heredada por medio de la clase Poligono que es padre de nuestra clase base, probemos lo mismo con el cuadrado:

>>> cuadrado = Cuadrado(12)
>>> print(cuadrado.area())
144
>>> print(cuadrado.get_tipo_geometrico())
Cuadrado
>>> cuadrado.trazar(0.93, (74, 75))
Trazando en (74, 75), ratio 0.93.
>>>
Anuncios

Como podemos ver funciono de la misma forma, por un lado pudimos ver como es la herencia multiple para poder crear una nueva clase sin necesidad de repetir codigo sino tambien vimos como vamos recibiendo los elementos de las clases superiores gracias a las herederas que actuan como bases, y como vengo repitiendo la herencia es siempre hacia abajo y nunca para arriba.

Anuncios

En resumen, hoy hemos visto como utilizar la herencia multiple, como se declara, cuales son sus beneficios, hemos visto algunos lenguajes que trabajan con la herencia multiple directa, tambien mencionamos algunos que lo hacen indirectamente, por ultimo hemos visto un ejemplo donde no solo vimos como aplicar la herencia multiple sino tambien como es la cadena de herencia entre distintas clases, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50