Índice
1 - Herencia en POO
Herencia es un concepto de la programación orientada a objetos. El cual es un mecanismo que permite derivar una clase a otra clase.
En otras palabras, tendremos unas clases que serán hijos, y otras clases que serán padres.
Las clases hijas pueden utilizar tanto sus métodos y propiedades como de la clase padre, siempre que su modificador de acceso lo permita.
Por ejemplo, el siguiente código
class Vehiculo
{
public decimal VelocidadMaxima { get; set; }
public int NumeroRuedas { get; set; }
public string Marca { get; set; }
public string Modelo { get; set; }
}
class Moto : Vehiculo
{
public int Cilindrada { get; set; }
}
class Coche : Vehiculo
{
public string Traccion { get; set; }
}
Traducido a una imagen será la siguiente:
Como podemos observar tanto coche como Moto apuntan a Vehiculo, eso quiere decir que pueden usar tanto sus propiedades como sus métodos. Por lo que el siguiente código Moto.VelocidadMaxima
o Moto.Cilindrada
es igual de válido que Coche.VelocidadMaxima
o Coche.Traccion
.
Para indicar que una clase deriva de otra debemos indicarlo con los dos puntos :
como vemos en el ejelmplo.
Cuando heredamos de una clase padre únicamente podemos hacerlo de una sola clase. No podemos heredar de dos clases, por ejemplo class Triciclo : Mixto, Vehiculo
no es válido.
Pero si en este ejemplo, la clase Mixto
hereda de Vehiculo
, si podemos hacer lo siguiente:
class Vehiculo{
//Código
}
class Mixto : Vehiculo{
//Código
}
class Triciclo : Mixto{
//Codigo
}
Como observamos Mixto
hereda de Vehiculo
, y Triciclo
hereda de Mixto
por lo que desde triciclo
tendremos acceso a las propiedades de la clase Vehiculo
como vemos en el ejemplo.
class Vehiculo
{
public int NumeroRuedas { get; set; }
}
class Mixto : Vehiculo
{
//Código
}
class Triciclo : Mixto
{
public void AsignarRuedas()
{
NumeroRuedas = 3;
}
}
2 - Declaración de constructores
Cuando creamos un constructor declaramos un método sin retorno y que se llama igual que la clase.
.Net nos genera por defecto a través de la clase object
el constructor por defecto, el cual es un constructor vacío sin argumentos. Pero, qué pasa si queremos tener uno personalizado, y la clase padre también posee un constructor.
Para ello debemos de seguir la jerarquía de que ambos constructores se van a ejecutar. Para ello deberemos de indicar desde el constructor de la clase hijo que parámetros vamos a pasar a la clase padre.
Los parámetros que vamos a enivar desde la clase hijo a la clase padre los indicaremos utilizando :base(parametros)
class Vehiculo
{
public decimal VelocidadMaxima { get; set; }
public int NumeroRuedas { get; set; }
public string Marca { get; set; }
public string Modelo { get; set; }
public Vehiculo(string marca, string modelo){
Marca = marca;
Modelo = modelo
}
}
class Moto : Vehiculo
{
public int Cilindrada { get; set; }
public Moto(string marca, string modelo, int cilindrada) : base(marca, modelo){
Cilindrada = cilindrada;
}
}
Como podemos observar en el ejemplo la clase padre Vehiculo
, tiene un constructor con dos parámetros, por lo que desde la case hijo Moto
, hemos creado un constructor que contiene, además del parámetro necesario para la propiedad de esa clase, dos adicionales que son enviados a la clase padre utilzando :base()
3 - Una clase hijo es también tipo de la clase padre
Una clase hijo no solo hereda los métodos y propiedades de la clase padre. Sino que además también hereda el tipo de la clase padre.
Si ejecutamos el siguiente código:
Vehiculo vehiculo = (Vehiculo)new Moto("ducati", "A1", 1000);
Vemos que lo realiza sin ningún problema, pero debido a que lo hemos convertido la clase Moto
a la clase Vehiculo
no podremos acceder a las propiedades de moto
.