¿Debería el siguiente código dar una advertencia?¿Por qué mi método estático oculta mi método de instancia?
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo { public static void Do() { /*...*/ } /*...*/ }
Da:
"CS0108 Advertencia: 'Bar.Do()' esconde miembro heredada 'Foo.Do()' Utilice la nueva palabra clave si se pretendía ocultar.".
Si hago un cambio en el código:
class Foo { public static void Do() { /*...*/ } /*...*/ }
class Bar : Foo { public void Do() { /*...*/ } /*...*/ }
tengo la misma advertencia.
Si realizo el siguiente cambio, sin embargo, la advertencia desaparece.
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo { new public static void Do() { /*...*/ } /*...*/ }
Permítanme hacer un nuevo cambio:
class Foo { public void Do() { /*...*/ } /*...*/ }
class Bar : Foo {
new public static void Do()
{ new Bar().Do();/*...*/ } /*...*/
}
Esto no se compila:
"CS0176 de error: Miembro 'Bar.Do()' no se puede acceder con una instancia referencia, califíquelo con un nombre de tipo en su lugar ".
¡Así que pierdo el acceso a mi método heredado a través de una referencia de instancia desde un método estático!
¿Cuál sería la lógica detrás de esto? ¿O hice un error tipográfico en alguna parte?
Me encontré con esto cuando estaba tratando de definir un método estático 'Mostrar' para mi formulario derivado de 'Forma'.
Hola Jon, +1 por respuesta. Creo que, desde la perspectiva del usuario del lenguaje, el error está en el camino de elegir el mejor método para llamar :-). Para mí, "new Bar(). Do()" indica claramente qué método se está llamando en el momento de la compilación y no es necesario producir un error. – isntn
Sospecho que la alternativa es hacer el lenguaje mucho más complicado. Con bastante frecuencia hay casos extremos que podrían mejorarse si el lenguaje fuera más inteligente, pero sería más difícil "conocer" bien el lenguaje y también implementarlo correctamente en un compilador. Todo es equilibrio ... –