Ocultación de Métodos en C#
Una vez estudiado el modo en el que los métodos se intercambian información a través de parámetros, volvemos al repaso de posibles modificadores que puede preceder a la declaración de un método. Ya hemos hablado de la herencia, esto es, de cómo una clase es capaz de obtener los miembros de una clase base. Sin embargo no sabemos cómo reimplementar en una clase heredada la funcionalidad de un miembro de la base. Para esto precisamente tenemos la instrucción new, teniendo lo siguiente:
using System;
public class Base {
public static void MetodoBase () {
Console.WriteLine (“Yo soy Base.MetodoBase ()”);
}
}
public class Heredada : Base {
public static void Main () {
MetodoBase ();
}
new public static void MetodoBase () {
Console.WriteLine (“Yo soy Heredada.MetodoBase ()”);
}
}
Tenemos dos clases, donde una hereda de la otra. La segunda además redefine el método MetodoBase() gracias al modificador new. Al ejecutar el programa, se vería lo siguiente:
Yo soy Heredada .MetodoBase ( )
lo que verifica que la redefinición ha sido un éxito. Si eliminamos el parámetro new el programa seguiría compilando, pero obtendríamos una advertencia:
New. cs ( 18 ) warning CS0108 :The keyword new is required on‘ Heredada . MetodoBas e ‘ because it hides inherited member‘ Base .MetodoBase ‘ Compilation succeeded – 1 warning(s) s )
El compilador nos ayuda a no ocultar métodos sin querer. Igualmente, si la clase Base no tuviera ninguna definición para MetodoBase(), el compilador también nos advertiría de que no estamos redefiniendo nada. Todo esto se puede complicar un poco más. Supongamos que tenemos una clase B que hereda de A, y una clase C que hereda de B. Pues bien, es posible redefinir un método de A en B, sin que C note el cambio, teniendo lo siguiente:
using System;
public class A {
public static void MetodoBase () {
Console.WriteLine (“Yo soy A.MetodoBase ()”); }
}
public class B : A {new prívate static void MetodoBase () {
Console.WriteLine (“Yo soy B.MetodoBase ()”);
public class C : B {
static void Main () {
MetodoBase ();}}
}
}
El método C imprimiría por pantalla “Yo soy A.MetodoBase ()” gracias a que en B hemos marcado la redefinición como privada, lo que la restringe a dicha clase. Si cambiamos prívate por public, o hacemos la llamada dentro de B conseguiremos “Yo soy B.MetodoBase ()”. Tenemos una doble herencia anidada de clases en la que la ocultación de métodos es solamente parcial.
Continúa en Métodos Virtuales