Buena pregunta. Permítanme reformularlos.
¿Por qué es legal ocultar un método con otro método?
Déjame responder esa pregunta con un ejemplo. Tiene una interfaz de CLR v1:
interface IEnumerable
{
IEnumerator GetEnumerator();
}
Súper. Ahora, en CLR v2 tienes genéricos y piensas "hombre, si solo hubiéramos tenido genéricos en v1, habría hecho de esta una interfaz genérica. Pero no lo hice. Debería hacer algo compatible con él ahora que sea genérico para que Obtengo los beneficios de los genéricos sin perder la compatibilidad con versiones anteriores del código que espera IEnumerable ".
interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> .... uh oh
¿De qué vas a llamar al método GetEnumerator IEnumerable<T>
? Recuerde, desea que oculte GetEnumerator en la interfaz base no genérica. Usted no quiere que lo que se llamará a menos que esté explícitamente en una situación revés-comp.
Eso solo justifica el método de ocultación. Para obtener más ideas sobre las justificaciones del método de ocultación, consulte mi artículo sobre el tema .
¿Por qué esconderse sin "nuevo" causa una advertencia?
Porque queremos advertirle que está ocultando algo y podría estar haciéndolo accidentalmente. Recuerde, es posible que esté ocultando algo accidentalmente debido a una edición de la clase base realizada por otra persona, en lugar de por usted editando su clase derivada.
¿Por qué esconderse sin "nuevo" es una advertencia en lugar de un error?
Misma razón. Es posible que esté ocultando algo accidentalmente porque acaba de adquirir una nueva versión de una clase base. Esto sucede todo el tiempo. FooCorp crea una clase base B. BarCorp crea una clase D derivada con un método Bar, porque a sus clientes les gusta ese método. FooCorp ve eso y dice bueno, es una buena idea, podemos poner esa funcionalidad en la clase base. Lo hacen y envían una nueva versión de Foo.DLL, y cuando BarCorp adquiere la nueva versión, sería bueno que se les dijera que su método ahora oculta el método de la clase base.
Queremos que esa situación sea una advertencia y no un error porque convertirlo en un error significa que esta es otra forma del problema de la clase base frágil . C # se ha diseñado cuidadosamente para que cuando alguien realiza un cambio en una clase base, se minimizan los efectos en el código que usa una clase derivada.
¿Por qué se oculta y no se anula el valor predeterminado?
Porque la anulación virtual es peligrosa . La anulación virtual permite que las clases derivadas cambien el comportamiento del código compilado para usar clases base. Hacer algo peligroso, como anular, debe ser algo que haga consciente y deliberadamente , no por accidente.