La herencia es una caracteristica de los lenguajes orientados a objetos la cual nos da la posibilidad de reutilizar codigo, esto es definir una clase a partir de otra clase comun. Supongamos que tenemos la necesidad de registrar caracteristicas y funciones de Empleados y Clientes en un programa cualquiera. Nos damos cuenta que tanto empleados como clientes comparten muchas caracteristicas en comun, nombre direccion edad etc, y seria tonto definirlas en ambas clases, por lo que creamos una clase que comparta sus caracteristicas comunes (variables y metodos) y luego a partir de esa clase creamos las demas, las clases que heredan posteriormente pueden incluir sus propias caracteristicas que la diferencian de las demas, ESTO ES HERENCIA.
A través de la herencia, una clase hija hereda de su padre los atributos y métodos, de manera que si por ejemplo tenemos una clase padre “Figura” con un atributo “área”, y dos clases hijas: “Rectángulo” y “Triángulo”.
En PHP la palabra clave para definir la herencia es: “extend” y la forma en que se define es:
El constructor y los atributos, “base” y “altura” están definidos en la clase “Figura”. El método “área” es propio de cada hija. Veamos la implementación y el resultado:
<?php class Figura { protected $base; protected $altura; function __construct($base, $altura) { $this->base = $base; $this->altura = $altura; } } class Rectangulo extends Figura { function area(){ return $this->base * $this->altura; } } class Triangulo extends Figura { function area(){ return $this->base * $this->altura /2; } } $rectangulo = new Rectangulo(2,2); $triangulo = new Triangulo(2,2); echo "<div>Para base = 2 y altura = 2: <ul> <li>Área para el rectángulo: " . $rectangulo->area() . ">/li> <li>Área para el triángulo: " . $triangulo->area() . "</li> </ul> </div>" ?>
Siguiendo con características propias de los lenguajes de alto nivel con orientación a objetos, llegamos a la herencia.
¿Qué es la herencia?
En programación orientada a objetos, la herencia es el mecanismo básico para crear nuevas clases (hijas o derivadas), basándonos en clases anteriores (a la que llamaremos padre, base o superclase). La relación es similar a la que se produce en muchas situaciones de la vida cotidiana, por ejemplo en el campo de la biología en las relaciones padre-hijo.
Gracias a este mecanismo, podemos basarnos en clases anteriores, para crear nuevas clases sobre trabajo ya hecho, de forma que extendemos la funcionalidad de la clase padre hacia un campo nuevo, sin tener que volver a reescribir todo el contenido de la misma.
Ejemplos
Hay multitud de casos de este tipo. Por ejemplo, la clase padre excepción, provee unos métodos y atributos generales para todas las excepciones posibles. De ella derivan excepciones concretas, por ejemplo de división entre cero, que además de los métodos y atributos ya existentes, añaden funcionalidad extra, pero reutilizando toda la funcionalidad de la clase padre.
Otro ejemplo clásico es el de los controles de una interfaz gráfica. La clase control es la padre de todo un abanico de clases hijo. La clase control tiene por ejemplo la situación (todos los controles tienen situación) pero cada clase hijo aporta nuevas funcionalidades (por ejemplo, sus propios eventos).
Implementación
Veremos la implementación en C# con un ejemplo concreto. Ya que están tan de moda los vehículos eléctricos, vamos a implementar una serie de clases, con herencia, que reflejen la siguiente realidad:
public class Motor{ int potencia; decimal par; public int Potencia { get { return this.potencia; } set { potencia = value; } } public decimal Par { get { return this.par; } set { par = value; } } } public class Electrico : Motor{ int intensidad; int potencial; public int Intensidad { get { return this.intensidad; } set { intensidad = value; } } public int Potencial { get { return this.potencial; } set { potencial = value; } } } public class CombustionInterna : Motor{ int cilindrada; int cilindros; public int Cilindrada { get { return this.cilindrada; } set { cilindrada = value; } } public int Cilindros { get { return this.cilindros; } set { cilindros = value; } } }