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 precisa­mente 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 modifica­dor 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 pro­grama seguiría compilando, pero obtendría­mos 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 here­da 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 priva­da, lo que la restringe a dicha clase. Si cam­biamos prívate por public, o hacemos la lla­mada dentro de B conseguiremos “Yo soy B.MetodoBase ()”. Tenemos una doble herencia anidada de clases en la que la ocul­tación de métodos es solamente parcial.

Continúa en Métodos Virtuales

¿Te gustó el artículo? Compártelo:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • Technorati
  • Twitter
  • Yahoo! Buzz

Deja un comentario