Rozumiem, że dziedziczenie metod statycznych nie jest obsługiwane w języku C#. Przeczytałem również wiele dyskusji (w tym tutaj), w których deweloperzy twierdzą, że istnieje taka potrzeba, na co typowa odpowiedź brzmi "jeśli potrzebujesz statycznego dziedziczenia członków, jest wada w twoim projekcie".Jaka jest poprawna alternatywa dla dziedziczenia metod statycznych?
OK, biorąc pod uwagę, że OOP nie chce, żebym nawet myślał o dziedziczeniu statycznym, muszę stwierdzić, że moja widoczna potrzeba wskazuje na błąd w moim projekcie. Ale utknąłem. Byłbym wdzięczny za pomoc w rozwiązaniu tego problemu. Oto wyzwanie ...
Chcę utworzyć abstrakcyjną klasę bazową (nazwijmy ją Owocem), która zawiera pewien złożony kod inicjalizacyjny. Tego kodu nie można umieścić w konstruktorze, ponieważ niektóre z nich będą opierać się na wywołaniach metod wirtualnych.
Owoce zostaną odziedziczone przez inne konkretne klasy (Apple, Orange), z których każda musi narazić standardową metodę fabryki CreateInstance(), aby utworzyć i zainicjować instancję.
Jeśli możliwe jest dziedziczenie statycznych elementów, umieściłbym metodę fabryczną w klasie bazowej i użyłbym wywołania metody wirtualnej do klasy pochodnej, aby uzyskać typ, z którego konkretna instancja musi zostać zainicjalizowana. Kod klienta mógłby łatwo wywołać funkcję Apple.CreateInstance() w celu uzyskania w pełni zainicjowanej instancji Apple.
Ale to nie jest możliwe, więc proszę, proszę, proszę wyjaśnić, w jaki sposób mój projekt musi się zmienić, aby dostosować tę samą funkcjonalność.
Chciałbym zaznaczyć, że stwierdzenie "Ten kod nie może zostać umieszczony w konstruktorze, ponieważ część z nich będzie polegać na wirtualnych wywołaniach metod" jest niepoprawna. MOŻESZ wywoływać wirtualne metody wewnątrz konstruktora. (Będziesz musiał dokładnie zaprojektować swoje połączenia, ponieważ możesz mieć częściowo zainicjowaną klasę, gdy metody wirtualne są wywoływane, ale są obsługiwane.) Zobacz odpowiedź Ravadre, aby uzyskać więcej szczegółów. – Ruben