Tipos de Herencia

Hasta hora vimos ejemplos de herencia donde una clase derivada hereda sólo de una clase base. Sin embargo, en la práctica pueden presentarse casos en que una clase herede de más de una clase padre. Por ejemplo, imaginemos que tenemos una clase Empleado, con una propiedad Sueldo, y una clase Músico con una propiedad InstrumentoQueToca y queremos definir una clase EmpleadoDeOrquesta. Como los empleados de orquestas son músicos (tocan un instrumento) y además son empleados (perciben un sueldo), podemos heredar de ambas clases para reutilizar el código de cada una. Este tipo de herencia se denomina Herencia Múltiple.

HERENCIA MÚLTIPLE La mayoría de los lenguajes actuales no soportan herencia múltiple, ya que en general este tipo de herencia presenta más problemas que soluciones. Uno de los problemas de la herencia múltiple es cómo resolver casos en que un método o propiedad existe en más de una clase base, entonces, ¿cuál es el que recibe la clase derivada? Tanto los
lenguajes de .Net como Java no permiten herencia múltiple.

CLASES ABSTRACTAS
En el ejemplo de las figuras geométricas que vimos al comienzo, definimos una clase Figura con un método CalcularSuperficie. Ahora bien, esa clase, es una abstracción de todas las posibles figuras geométricas y, por lo tanto, no le podemos definir el cálculo de superficie, ya que depende de cada tipo de figura. Afortunadamente, para resolver cuestiones como ésta desde el diseño, tenemos la posibi- lidad de crear métodos abstractos: métodos que están declarados, pero que no tienen implementación. La implementación de un método abstracto queda rele- gada a las clases derivadas. Una clase que contiene al menos un método abstrac- to se denomina abstracta.

INTERFACES
Las interfaces son un derivado de las clases abstractas. En particular, una in- terfaz es esencialmente igual a una clase con todos sus métodos abstractos. Una clase que herede de una interfaz (en realidad para hablar correctamente debe- mos decir que la clase implementa una interfaz) está obligada a implementar todos sus métodos y propiedades. Las interfaces se utilizan para proveer una abstracción de algún comportamiento. Además, los lenguajes modernos como Java y los lenguajes de .Net permiten que una clase implemente varias interfaces, proveyendo así una especie de herencia múltiple.

Las interfaces permiten abstraer comportamientos y, a la vez, heredar de otra clase,
proveyendo un tipo de herencia múltiple.

CLASE ABSTRACTA O INTERFAZ Una decisión que muchas veces tendremos que tomar es si optar por una clase abstracta o por una interfaz. La diferencia radica en dos puntos: si usamos una clase abstracta, tendremos la posibilidad de escribir algo de código (métodos no abstractos), para no tener que escribirlo en cada clase descendiente. Con las interfaces, tendremos abierta la posibilidad de heredar de otra clase.

INSTANCIA En .Net, cuando definimos una variable que es una instancia de una clase, en realidad, lo que estamos guardando en la variable no es el objeto completo sino la dirección de memoria (en el HEAP) donde se encuentra el objeto. Cuando pasamos un parámetro por valor, lo hacemos por referencia, y cualquier modificación del parámetro, la haremos sobre el objeto original.