Хорошо, вы бы использовали "sealed" в методе , только если вы не хотите, чтобы какие-либо производные классы переопределяли ваш метод. Методы запечатаны по умолчанию, если они не объявлены как виртуальные и не переопределяют другие виртуальные методы. (В Java методы являются виртуальными по умолчанию - для достижения «стандартного» поведения C # необходимо пометить метод как final
.)
Лично мне нравится тщательно контролировать наследование - я предпочитаю запечатывать целые классы, где это возможно. Однако в некоторых случаях вы все еще хотите разрешить наследование, но убедитесь, что некоторые методы не переопределяются. Одним из применений может быть эффективное создание шаблона метода , например для диагностики:
public sealed override void Foo(int x)
{
Log("Foo called with argument: {0}", x);
FooImpl(x);
Log("Foo completed");
}
protected abstract void FooImpl(int x);
Теперь подклассы не могут переопределять Foo
напрямую - им придется переопределять FooImpl
, поэтому наше поведение будет всегда выполняться, когда другой код вызывает Foo
.
Шаблон может быть, конечно, по другим причинам - например, для обеспечения определенных аспектов проверки аргументов.
По моему опыту, запечатанные методы не очень часто используются, но я рад, что такая возможность есть. (Я просто хочу, чтобы классы были запечатаны по умолчанию, но это другой разговор.)