Mam na myśli to, że możliwe jest oznaczenie wirtualnej metody w języku C# jako ostatecznej, aby żadne inne typy pochodzące z tego typu nie mogły go zastąpić?Czy możliwe jest sfinalizowanie wirtualnej metody w C#?
Odpowiedz
Tak: podczas przesłaniania metody można ją również zadeklarować jako sealed
.
Dobra odpowiedź. Jedna kwestia wyjaśnienia do PO; tylko nadpisanie wirtualnych metod (które same są również wirtualne) może być zapieczętowane; deklaracja, która ma słowo "wirtualne", nie może być również "zapieczętowana". Jest zbędny; Zapieczętowane słowo kluczowe "cofa" wirtualne lub abstrakcyjne słowo kluczowe, które uczyniło metodę wirtualną w klasie bazowej. Musi istnieć co najmniej jeden poziom dziedziczenia między uczynieniem metody wirtualną a jej uszczelnieniem. – KeithS
Dzięki KeithS, czy możesz podać przykład kodu? Nie sądzę, żebym to zrozumiał. –
w zasadzie, 'public override uszczelnione void MyMethod()' kompiluje. 'public virtual sealed void MyMethod()' nie, ponieważ na tym samym poziomie dziedziczenia, zaznaczasz tę metodę jako możliwą do zastąpienia i nie można jej zastąpić. Jest zbędny; 'public void MyMethod()' utworzyłby metodę nieprzechowalną. Tego właśnie próbowałem dokonać; chociaż wirtualne metody mogą być zapieczętowane, muszą to być faktycznie przesłonięcia metody bazowej, która pierwotnie była oznaczona jako wirtualna. – KeithS
Możesz użyć sealed.
- 1. W języku C++ możliwe jest zdefiniowanie funkcji czysto wirtualnej?
- 2. Alternatywa dla wywoływania wirtualnej metody w C#
- 3. Czy możliwe jest zadeklarowanie metody Objective-C poza klasą?
- 4. Czy słowo kluczowe "przesłonięcie" jest tylko sprawdzeniem zastępowanej metody wirtualnej?
- 5. czy możliwe jest przeciążenie ostatecznej metody?
- 6. Czy możliwe jest rozszerzenie tablic w C#?
- 7. Czy możliwe jest przeciążenie operatorów w C?
- 8. Czy możliwe jest metaprogramowanie w C#?
- 9. Znajdź oryginalną implementację metody wirtualnej
- 10. C# Czy jest możliwe podanie lambda, gdy wymagany jest interfejs?
- 11. Czy jest możliwe generowanie złożonych dźwięków w języku C#?
- 12. C++ przesłonić czystą metodę wirtualną za pomocą czystej wirtualnej metody
- 13. Czy jest możliwe utworzenie System.Int32 w języku C#?
- 14. Czy jest możliwe stosowanie różnych typów zwracania dla przeciążonej metody?
- 15. Czy możliwe jest wywołanie metody oddzwaniania po onDestroy?
- 16. C++ Wdrożenie funkcji wirtualnej?
- 17. Czy jest możliwe utworzenie ogólnej metody na obiekcie dynamicznym/ExpandoObject
- 18. Czy jest możliwe utworzenie nowego operatora w języku C#?
- 19. Czy jest możliwe wydrukowanie zmiennej preprocesora w C?
- 20. Czy możliwe jest zapisanie wyrażenia lambda w tablicy C#
- 21. Czy jest możliwe/zalecane przechowywanie wektora w strukturze? C++
- 22. Czy jest możliwe rozwinięcie statycznej pętli w C++?
- 23. Czy możliwe jest zaimplementowanie mapy wolnej od blokady w C++
- 24. Czy jest możliwe, aby połączyć ciąg i DBNull w C#?
- 25. Czy zarządzanie zasobami C++ jest możliwe w Javie
- 26. Czy jest możliwe użycie CallerMemberNameAttribute w f #
- 27. Dlaczego przeciążanie nie jest możliwe w C?
- 28. Uzyskiwanie dostępu do członka/metody wirtualnej klasy pochodnej
- 29. Czy możliwe jest posiadanie hierarchii "#pragma mark"?
- 30. Wywołanie wirtualnej metody natychmiast po zakończeniu budowy
Z ciekawości, jaki jest twój przypadek użycia? Jest to dość rzadko używana funkcja. Jaki jest scenariusz, w którym sensowne jest zapieczętowanie * metody *, ale nie * klasy *? –
@Eric: Właściwie nie mam żadnego przypadku użycia: O Ale stało się to. Używam zewnętrznej biblioteki .NET, której jeszcze nie ma. Ta biblioteka ma wiele typów, w których mają tylko wewnętrzne konstruktory. Chcę tworzyć własne typy wywodzące się z nich, ale tak to jest, nie jest to możliwe, ponieważ konstruktorzy muszą być publiczni. Poprosiłem ich o to i powiedzieli, że wirtualne metody mogą powodować trudne do debugowania, podchwytliwe błędy, więc nie mogą tego zrobić. Niejasno pamiętałem sposób na "sfinalizowanie"/przypieczętowanie wirtualnych metod, dlatego poprosiłem o to i powiedziałem im, że jeśli są zainteresowani, mogą użyć .. –
zapieczętowanego słowa kluczowego do uszczelnienia tych wirtualnych metod. Powiedział im również, że dziedziczenie nie jest przeznaczone dla ich biblioteki, to typy powinny być zapieczętowane dla wydajności. Ale z tymi typami mającymi wewnętrznych konstruktorów, nie można ich naprawdę wykorzystać. Co myślisz? Czy uważasz, że ich obawy dotyczące dziedziczenia i metod wirtualnych są ważne? –