Puede ocurrir que en un método de una clase hija no nos interese redefinir por completo las posibilidades del método equivalente de la superclase, sino ampliarlas. En ese caso, no hace falta que volvamos a teclear todo lo que hacía el método de la clase base, sino que podemos llamarlo directamente, precediéndolo de la palabra "base".
Por ejemplo, podemos hacer que un Gato Siamés hable igual que un Gato normal, pero diciendo "Pfff" después, así:
public new void Hablar()
{
base.Hablar();
Console.WriteLine("Pfff");
}
Este podría ser un fuente completo:
// Ejemplo_07_04a.cs
// Ejemplo de clases: Llamar a la superclase
// Introducción a C#, por Nacho Cabanes
using System;
public class Ejemplo_07_04a
{
public static void Main()
{
Gato miGato = new Gato();
GatoSiames miGato2 = new GatoSiames();
miGato.Hablar();
Console.WriteLine(); // Linea en blanco
miGato2.Hablar();
}
}
// ------------------
public class Animal
{
// Todos los detalles están en las subclases
}
// ------------------
public class Gato: Animal
{
public void Hablar()
{
Console.WriteLine("Miauuu");
}
}
// ------------------
public class GatoSiames: Gato
{
public new void Hablar()
{
base.Hablar();
Console.WriteLine("Pfff");
}
}
Su resultado sería
Miauuu
Miauuu
Pfff
También podemos llamar a un constructor de la clase base desde un constructor de una clase derivada. Por ejemplo, si tenemos una clase "RectanguloRelleno" que hereda de otra clase "Rectangulo" y queremos que el constructor de "RectanguloRelleno" que recibe las coordenadas "x" e "y" se base en el constructor equivalente de la clase "Rectangulo", lo haríamos así:
public RectanguloRelleno (int x, int y )
: base (x, y)
{
// Pasos adicionales
// que no da un rectangulo "normal"
}
(Si no hacemos esto, el constructor de RectanguloRelleno se basaría en el constructor sin parámetros de Rectangulo, no en el que tiene x e y como parámetros).
Ejercicios propuestos:
Ejercicio propuesto 7.4.1: Crea una versión ampliada del ejercicio 7.3.3, en la que el método "Hablar" de todas las clases hijas se apoye en el de la clase "Trabajador".
Ejercicio propuesto 7.4.2: Crea una versión ampliada del ejercicio 7.4.1, en la que el constructor de todas las clases hijas se apoye en el de la clase "Trabajador".
Ejercicio propuesto 7.4.3: Refina el proyecto Libro (ejercicio 7.3.4), para que el método ToString de la clase Libro se apoye en el de la clase Documento, y también lo haga el de la clase Articulo.
Ejercicio propuesto 7.4.4: Amplía el esqueleto de ConsoleInvaders (7.3.5) para que en Enemigo haya un único constructor que reciba las coordenadas X e iniciales. Los constructores de los tres tipos de enemigos deben basarse en éste.