2011-01-12 12 views
5

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#?

+0

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 *? –

+0

@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ć .. –

+0

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? –

Odpowiedz

22

Tak: podczas przesłaniania metody można ją również zadeklarować jako sealed.

+2

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

+0

Dzięki KeithS, czy możesz podać przykład kodu? Nie sądzę, żebym to zrozumiał. –

+3

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

Powiązane problemy