To jest świetne pytanie, które napotkałem w moich projektach.
Niektórzy ludzie utrzymują, że interfejsy i klasy abstrakcyjne istnieją tylko dla polimorfizmu, a nie dla forsowania typów do implementacji określonych metod. Osobiście uważam polimorfizm za podstawowy przypadek użycia, a przymusowa implementacja za wtórną. Często stosuję technikę wymuszonej implementacji. Zazwyczaj pojawia się w kodzie kodu implementującego wzorzec szablonu. Klasa bazowa/szablon zawiera pewną złożoną ideę, a podklasy zapewniają liczne warianty, stosując metody abstrakcyjne. Jedną z pragmatycznych korzyści jest to, że abstrakcyjne metody dostarczają wskazówek innym programistom wdrażającym podklasy. Program Visual Studio ma nawet możliwość wypróbowania metod. Jest to szczególnie przydatne, gdy deweloper musi dodać nową podklasę kilka miesięcy lub lat później.
Wadą jest brak konkretnego wsparcia dla niektórych z tych scenariuszy szablonów w języku C#. Metody statyczne to jedność. Kolejny to konstruktorzy; Idealnie ISerializable powinno zmusić programistę do wdrożenia chronionego konstruktora serializacji.
Najprostszym podejściem jest prawdopodobnie (zgodnie z sugestią wcześniejszą) skorzystanie z automatycznego testu w celu sprawdzenia, czy metoda statyczna jest zaimplementowana na pożądanych typach. Innym dobrym pomysłem, o którym już wspomniano, jest implementacja reguły analizy statycznej.
Trzecią opcją jest użycie architektury programowania zorientowanej na aspekt, takiej jak PostSharp. PostSharp obsługuje sprawdzanie poprawności aspektów w czasie kompilacji. Możesz napisać kod .NET, który odbija się w zespole podczas kompilacji, generując dowolne ostrzeżenia i błędy. Zwykle robi się to, aby sprawdzić, czy użycie aspektu jest odpowiednie, ale nie rozumiem, dlaczego nie można go użyć do sprawdzania poprawności reguł szablonów.
Wybacz moją ciekawość, ale nie mogę przestać się zastanawiać, dlaczego potrzebujesz takiej funkcji? Co mają metody statyczne, które nie mają zwykłe metody instancji (niestatyczne)? Nic nie przychodzi mi do głowy. Chcesz podzielić się pewnym kontekstem na swoje pytanie? – Dan
Nie potrzebujesz instancji, aby wywołać metodę statyczną. Są więc przyjemne w użyciu jako metody fabryczne, na przykład metoda dekantalizacji. – tpower
@Dan: Dodatkowym zastosowaniem byłaby możliwość korzystania z interfejsu bez wiedzy, czy pracujesz nad instancją lub typem (lub zmieniając to później). Pomyśl o klasie statycznej, która reprezentuje jakąś pojedynczą listę - i powinna, jako odpowiednia lista, zaimplementować 'IList'. Oczywiście, obejście problemu z instancją klasy implementującej 'IList ' w klasie statycznej jest wykonalne (i jestem świadomy, że C# obecnie na razie pozwala to tylko w ten sposób), ale możliwość bezpośredniego deklarowania klasy jako statycznie implementacja interfejsu usunie niepotrzebny poziom pośrednictwa. –