Curso C# con Mono – Herencia

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:

  • Clase padre: motor, tendrá las características propias de toda clase de motores, gestionaremos potencia (entero en kW) y par (decimal en Nm)
  • Clase hijo: eléctrico, contendrá información exclusiva de los motores eléctricos, intensidad (entero en amperios), potencial (entero en voltios)
  • Clase hijo: de combustión interna, gestionará información de este tipo de motores. Cilindrada (entero en cc.), número de cilindros (entero) y emisiones de CO2 (decimal en gr/km)
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; }
	}
}

Como veis la implementación es como la de cualquier otra clase, pero añadiendo los dos puntos y el nombre de la clase padre al declarar a la clase hija. Luego podremos hacer llamadas del tipo:

Electrico a = new Electrico();
a.Potencia = 100;

Clases abstractas

Si incluimos la palabra reservada abstract al declarar la clase padre: abstract class Motor; estamos indicándole a Mono que esa clase no podrá instanciarse. Es decir, podremos crear clases derivadas e instanciarlas, pero nunca crear objetos de la clase padre (en este caso, podríamos crear objetos de Electrico o CombustionInterna, pero no podríamos instanciar Motor).

Métodos virtuales

Si declaramos un método en la clase padre, en la clase hijo no podremos volver a declararlo a no ser que en la clase padre sea del tipo virtual. Para ello, en la declaración del método en el padre utilizaríamos la siguiente estructura:

public virtual void mostrarDatos()

Y en el hijo, al declarar el método haríamos uso de la palabra clave override:

public override void mostrarDatos()

Entregas anteriores

Author Description

F. Javier Carazo Gil

Casi Ingeniero Informático, co-fundador y administrador de Linux Hispano, además de desarrollar software y mantener sistemas en el CSIC, hace poco he fundado junto con Alberto Hornero una start-up: CODECTION donde trabajamos con software libre. Puedes saber más sobre mí, mi vida laboral, mis libros, mis artículos y mi día a día en @fjcarazo y en mi perfil público de LinkedIn.

  • Pingback: Bitacoras.com

  • Hilario

    Estos artículos de MONO, son muy didácticos y fáciles de entender, muy buen trabajo!

  • http://www.jcarazo.com carazo

    @Hilario: Muchas gracias. Por este tipo de comentarios merece la pena seguir invirtiendo tiempo y esfuerzo en intentar hacer este tipo de cosas.

  • Ambrosio

    Este es el ultimo post de el “libro”?

    Saludos.

  • http://www.jcarazo.com carazo

    @Ambrosio: Tu comentario indica que te interesa el curso :), sí habrá más capítulos, por lo menos uno más y espero que salga esta semana. A partir de ahí no sé si empezaré con algo de GTK# o lo dejaré por zanjado y pasaré a otros cursos que tengo pensados.

  • Pingback: Curso C# con Mono – Interfaces | Linux Hispano

  • Pingback: Curso C# con Mono – Interfaces | Superlinux

  • ale

    muy buen post!
    y muy buenos los anteriores!

    gracias!