2014-05-13 20 views
6

Microsoftu na C# Coding Conventions (C# Programming Guide) wyraźnie stwierdza:Dlaczego "Nie uzyskuj dostępu do statycznego elementu zdefiniowanego w klasie bazowej z klasy pochodnej." artykuł

„Nie dostęp członka statycznego, który jest zdefiniowany w klasie bazowej ze klasy pochodnej.”

Dlaczego nie należy uzyskiwać dostępu do statycznego elementu?

Wygląda na to, że istnieją odpowiednie scenariusze, w których to się dzieje, na przykład wszystkie elementy const są statyczne. Czy klasy pochodne nigdy nie będą w stanie odczytać elementu const zdefiniowanego w klasie bazowej?

+0

Spójrz na to pytanie: [Unikanie "dostępu do statycznego elementu typu za pomocą typu pochodnego"] (http://stackoverflow.com/questions/4405953/avoiding-access-to-a-static- członek-typu-za-typu-pochodnego? rq = 1) –

Odpowiedz

6

Jako przykład podajemy przykład object.ReferenceEquals. Oto kilka sposobów, można wywołać tę metodę z klasy pochodnej:

class A { 
A() { 
    ReferenceEquals("a", "b"); //your warning is based on this style 
    object.ReferenceEquals("a", "b"); //recommended style 
} 
} 

Fakt ReferenceEquals jest dostępny w A to tylko zbieg okoliczności. Metoda statyczna jest niezależna od dowolnej hierarchii dziedziczenia. Dlatego zawsze nazywaj to w pełni kwalifikacjami z dowolnego miejsca.

To ostrzeżenie dotyczy tylko stylu i jasności. Wszystkie warianty, które pokazałem, kompilują do tej samej IL.

Inną interpretacją byłoby, że niewłaściwie używasz dziedziczenia, aby skrócić składnię używaną do wywołania metody. Jest to nadużycie spadku. ASP.NET MVC robi to z klasą podstawową kontrolera. Pozwala pisać return View();. Wykorzystuje dziedziczenie, aby zestaw metod był dogodnie dostępny.

+0

Twoje pierwsze dwa (uzyskując go jak metoda instancji) nie kompilują się w C#; może myślisz o Jawie? –

+0

@TimS. w rzeczywistości była to Java. Dzięki. – usr