Niedawno bawiłem się z pomysłem zastosowania metod rozszerzających do implementacji narzędzi pomocniczych na klasach, które kontroluję (tj. Są w tym samym programie i mogę modyfikować). Powodem tego jest to, że wiele razy te programy pomocnicze są używane w bardzo specyficznych sytuacjach i nie wymagają dostępu do klas wewnętrznych wartości.Czy dopuszczalne jest stosowanie metod rozszerzenia dla klasy, którą można zmodyfikować?
Na przykład załóżmy, że mam klasę StackExchange. Będzie miał metody takie jak PostQuestion
i Search
i AnswerQuestion
.
Co, jeśli chciałbym ręcznie obliczyć swoją reputację, aby upewnić się, że StackOverflow mnie nie zdradza. Chciałbym zaimplementować coś wzdłuż linii:
int rep=0;
foreach(var post in StackExchangeInstance.MyPosts)
{
rep+=post.RepEarned;
}
mogę dodać metodę do klasy Stack Exchange Network, ale nie wymaga żadnych wewnętrzne, i jest używany tylko z jednego lub dwóch innych części programu .
Teraz wyobraź sobie, że zamiast tego masz 10 lub 20 takich specyficznych metod pomocniczych. Przydatny w pewnym scenariuszu na pewno, ale zdecydowanie nie w ogólnym przypadku. Mój pomysł zmienia się coś
public static RepCalcHelpers
{
public static int CalcRep(StackExchange inst){ ... }
}
do czegoś
namespace Mynamespace.Extensions.RepCalculations
{
public static RepCalcExtensions
{
public static int CalcRep(this Stackexchange inst){...}
}
}
Uwaga nazw. Najlepiej byłoby użyć tego do grupowania metod rozszerzenia w określonym scenariuszu. Na przykład "Wyliczenia", "Statystyka" itp.
Próbowałem wyszukać, czy ten wzorzec jest w ogóle słyszalny, i nie znalazłem żadnego dowodu na to, że metody rozszerzające są używane do innych niż klas nie można modyfikować.
Jakie są niedociągnięcia w tym "wzorze"? Czy zamiast tego powinienem trzymać się dziedziczenia lub kompozycji, lub po prostu dobrej klasy statycznej pomocnika?
Metody rozszerzeń mają być stosowane, gdy nie można zmodyfikować oryginalnej klasy. Jeśli to ty wykonujesz zajęcia, nie widzę wartości dodanej. Jeśli chcesz tylko umieścić metody w oddzielnym pliku kodu, możesz użyć słowa kluczowego 'partial'. –
Po to, by wyjaśnić, zrobiłbyś to, aby ukryć pewne funkcje, nie uwzględniając konkretnych instrukcji 'using', które posiadają metody rozszerzenia krawędzi. Bardzo interesujące! –
Możesz sprawdzić link [to] (http://stackoverflow.com/a/551600/649524), który określa zalety i wady metod rozszerzeń. – Tilak