Запечатана ключова дума във връзка с отмяна

Винаги ли е необходимо да следвате ключовата дума sealed с override в подписа на метод като кода по-долу:

public sealed override string Method1(){.....}

Искам да кажа, че ако искам да "запечатам" метода в базовия клас без отмяна, ключовата дума override все още ли е необходима?


person Victor Mukherjee    schedule 13.12.2012    source източник


Отговори (4)


Запечатването на метод има смисъл само ако го отмените.

Това, което се случва тук, е следното:
Вие заменяте метод от базов клас (override) и казвате на компилатора, че класовете, получени от вашия клас, вече нямат право да заменят този метод (sealed) .

Ако методът е нов, деклариран от вас във вашия клас и искате да попречите на производните класове да го заменят, просто не го декларирайте като виртуален.

Ако методът е деклариран в базов клас, но не може да бъде заменен, запечатването няма да има смисъл, защото вече не може да бъде заменено.

person Daniel Hilgarth    schedule 13.12.2012
comment
Нямах предвид това. Искам да знам дали да речем Myclass не наследява от нито един клас и има метод, който искам да бъде запечатан, този метод не е заменен в MyClass, но е деклариран за първи път. - person Victor Mukherjee; 13.12.2012
comment
@VictorMukherjee: Ако вие сте този, който декларира метода, вие вече имате пълен контрол. Ако не искате да бъде отменен в производни класове, просто не го правете виртуален. Вижте също втория до последния параграф в моя отговор. - person Daniel Hilgarth; 13.12.2012
comment
добре, разбрах. Съжалявам, забравих за това виртуално нещо, тъй като познавам java, експериментирам със c# само за няколко дни. - person Victor Mukherjee; 13.12.2012
comment
@VictorMukherjee: Да, това е важна разлика: В Java методите са виртуални по подразбиране и трябва изрично да ги декларирате като невиртуални чрез ключовата дума final. В C# е обратното: по подразбиране методите са невиртуални и трябва изрично да ги декларирате като виртуални чрез ключовата дума virtual. - person Daniel Hilgarth; 13.12.2012
comment
Има и abstract методи, които са като виртуални методи, но трябва да бъдат заменени. - person Olivier Jacot-Descombes; 17.03.2018

I think Mr. Hilgarth has provided the best answer here , but just to add something new for programmers who have a previous background in Java(like myself), I think most programmers new to C#, tend to confuse sealed with final in Java with respect to overriding.

In Java, the default behaviour without specifying "any" modifier is that the method can be overriden in its derived classes.

Докато в C#, поведението по подразбиране е, че методът не може да бъде отменен, освен ако не е изрично указан чрез ключовата дума virtual.

Надявам се това да помогне за допълване на най-добрия отговор по-горе.

person Zaid Khan    schedule 13.07.2016

Можете да запечатате само отмяна, така че предполагам, че отговорът е да.

person Justin Harvey    schedule 13.12.2012

Е, технически е възможно .... обаче решението в моя вариант е доста мръсно.

Представете си, че имате клас A (или във вашата кодова база, или във външна библиотека):

public class A
{
    public virtual void M () { /* implementation */ }
}

Можете да дефинирате (абстрактен) клас B : A както следва:

public class B : A
{
    public sealed override void M() => base.M();
}

Всеки клас C : B няма да може да замени A.M, тъй като сте запечатали метода (въпреки че не сте направили семантични промени).

person unknown6656    schedule 03.05.2020