Dobre pytania. Pozwól mi je powtórzyć.
Dlaczego w ogóle ukrywanie metody inną metodą jest legalne?
Odpowiem na to pytanie na przykładzie. Masz interfejs z CLR v1:
interface IEnumerable
{
IEnumerator GetEnumerator();
}
Wspaniały. Teraz w CLR v2 masz generyczne i myślisz „stary, gdybyśmy tylko mieli generyczne w v1, zrobiłbym to jako ogólny interfejs. Ale nie zrobiłem. Powinienem stworzyć coś kompatybilnego z tym teraz, co jest ogólne, więc Korzystam z zalet leków generycznych bez utraty wstecznej zgodności z kodem, który oczekuje od IEnumerable. ”
interface IEnumerable<T> : IEnumerable
{
IEnumerator<T> .... uh oh
Co zamierzasz wywołać metodę GetEnumerator IEnumerable<T>
? Pamiętaj, chcesz , aby ukrywał GetEnumerator w nieogólnym interfejsie podstawowym. Ty nigdy chcesz, aby ta rzecz została wywołana, chyba że jesteś wyraźnie w sytuacji kompatybilności wstecznej.
Samo to uzasadnia ukrywanie metody. Więcej przemyśleń na temat uzasadnień ukrywania metod w moim artykule na ten temat .
Dlaczego ukrywanie się bez „nowego” powoduje ostrzeżenie?
Ponieważ chcemy zwrócić Twoją uwagę, że coś ukrywasz i możesz to zrobić przypadkowo. Pamiętaj, że możesz przypadkowo ukryć coś z powodu edycji klasy bazowej wykonanej przez kogoś innego, a nie przez edycję klasy pochodnej.
Dlaczego ukrywanie bez „nowego” jest raczej ostrzeżeniem niż błędem?
Ten sam powód. Być może przypadkowo coś ukrywasz, ponieważ właśnie wybrałeś nową wersję klasy bazowej. Dzieje się to cały czas. FooCorp tworzy klasę bazową B. BarCorp tworzy klasę pochodną D za pomocą metody Bar, ponieważ ich klienci lubią tę metodę. FooCorp widzi to i mówi hej, to dobry pomysł, możemy umieścić tę funkcjonalność w klasie bazowej. Robią to i wysyłają nową wersję Foo.DLL, a kiedy BarCorp odbierze nową wersję, byłoby miło, gdyby powiedziano im, że ich metoda ukrywa teraz metodę klasy bazowej.
Chcemy, aby ta sytuacja była ostrzeżeniem, a nie błędem, ponieważ popełnienie błędu oznacza, że jest to kolejna forma kruchego problemu z klasą bazową . Język C # został starannie zaprojektowany, aby gdy ktoś wprowadził zmianę w klasie bazowej, wpływ na kod, który używa klasy pochodnej, został zminimalizowany.
Dlaczego ukrywa się i nie zastępuje wartości domyślnej?
Ponieważ wirtualne nadpisanie jest niebezpieczne . Wirtualne przesłonięcie umożliwia klasom pochodnym zmianę zachowania kodu, który został skompilowany w celu użycia klas podstawowych. Robienie czegoś niebezpiecznego, jak dokonywanie zmian, powinno być czymś, co robisz świadomie i celowo , a nie przez przypadek.