El mecanismo de herencia es uno de los pilares
fundamentales en los que se basa la programación orientada a objetos. Es un mecanismo que permite definir nuevas
clases a partir de otras ya definidas de modo que si en la definición de una
clase indicamos que ésta deriva de otra, entonces la primera -a la que se le
suele llamar clase hija- será
tratada por el compilador automáticamente como si su definición incluyese la
definición de la segunda –a la que se le suele llamar clase padre o clase base.
Las clases que derivan de otras se definen usando la siguiente sintaxis:
class <nombreHija>:<nombrePadre>
{
<miembrosHija>
}
A los miembros definidos en <miembrosHijas> se le añadirán los que
hubiésemos definido en la clase padre. Por ejemplo, a partir de la clase Persona puede crearse una clase Trabajador así:
class
Trabajador:Persona
{
public int Sueldo;
public Trabajador(string nombre, int edad, string nif, int sueldo)
: base(nombre, edad, nif)
{
Sueldo
= sueldo;
}
}
Los objetos de esta clase Trabajador contarán con los mismos miembros que los objetos Persona y además incorporarán un nuevo campo llamado Sueldo que almacenará el dinero que cada trabajador gane.
Nótese además que a la hora de escribir el constructor de esta clase ha sido
necesario escribirlo con una sintaxis especial consistente en preceder la llave
de apertura del cuerpo del método de una estructura de la forma:
:
base(<parametrosBase>)
A esta estructura se le llama inicializador
base y se utiliza para indicar cómo deseamos inicializar los campos
heredados de la clase padre. No es más que una llamada al constructor de la
misma con los parámetros adecuados, y si no se incluye el compilador
consideraría por defecto que vale :base(), lo que sería incorrecto en este ejemplo
debido a que Persona carece
de constructor sin parámetros.
Un ejemplo que pone de manifiesto
cómo funciona la herencia es el siguiente:
using System;
class Persona
{
public string Nombre; // Campo de cada objeto Persona que
almacena su nombre
public int Edad; // Campo de cada objeto Persona que almacena su edad
public string NIF; // Campo de cada objeto Persona que
almacena su NIF
void Cumpleaños() // Incrementa en uno de edad del objeto Persona
{
Edad++;
}
public Persona (string nombre, int edad,
string nif) // Constructor de Persona
{
Nombre = nombre;
Edad = edad;
NIF = nif;
}
}
class
Trabajador: Persona
{
public int Sueldo; // Campo de cada objeto
Trabajador que almacena cuánto gana
Trabajador(string nombre, int edad, string
nif, int sueldo): base(nombre, edad, nif)
{ // Inicializamos cada Trabajador en
base al constructor de Persona
Sueldo = sueldo;
}
public static void Main()
{
Trabajador p = new
Trabajador("Josan", 22, "77588260-Z", 100000);
Console.WriteLine ("Nombre="+p.Nombre);
Console.WriteLine
("Edad="+p.Edad);
Console.WriteLine ("NIF="+p.NIF);
Console.WriteLine ("Sueldo="+p.Sueldo);
}
}
Nótese que ha sido necesario
prefijar la definición de los miembros de Persona
del palabra reservada public. Esto se debe a que por defecto los
miembros de una tipo sólo son accesibles desde código incluido dentro de la
definición de dicho tipo, e incluyendo public conseguimos que sean accesibles desde
cualquier código, como el método Main() definido
en Trabajador. public es lo que se
denomina un modificador de acceso,
concepto que se tratará más adelante en este mismo tema bajo el epígrafe
titulado Modificadores de acceso.