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

Всегда ли необходимо следовать ключевому слову 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