Подтвердить что ты не робот

Предотвращение переопределения отдельных методов в С#

Я знаю, что я могу использовать запечатанное, чтобы другие классы не наследовали определенный класс, но возможно ли разрешить наследование, но предотвратить переопределение некоторых виртуальных методов?

4b9b3361

Ответ 1

Только методы virtual могут быть переопределены.
Просто оставьте virtual, и ваш метод не будет переопределяемым.

Ответ 2

вы также можете использовать закрытый модификатор, чтобы предотвратить производный класс от дальнейшего переопределения метода.

проверьте это: Запечатанные методы

Ответ 3

Да. Ключевое слово sealed также можно использовать для методов, чтобы указать, что метод, который является виртуальным или абстрактным на более высоких уровнях наследования, не может быть далее унаследован.

Если метод никогда не был виртуальным или абстрактным для начала, не беспокойтесь; он не может быть переопределен.

Обратите внимание, что sealed влияет только на переопределение метода; метод hiding не может быть остановлен таким образом, поэтому дочерний класс может объявить метод new с тем же именем и сигнатурой, что и ваш запечатанный метод.

Ответ 4

Вы можете получить ключевое слово sealed для работы над методом в абстрактном классе, сделав сам этот абстрактный класс:

abstract class DocumentTemplateBase
{
    public abstract void WriteTitle();
    public abstract void WriteSections();
}

abstract class DocumentTemplate : DocumentTemplateBase
{
    public override sealed void WriteTitle() 
    {
        Console.WriteLine("Project document"); 
    }

    public override sealed void WriteSections() 
    {
        Console.WriteLine("Sections");
    }

    abstract public void WriteContent();
}

Вывод вашего конкретного класса из исходного (и теперь полученного) абстрактного класса:

class Document1_FromTemplate : DocumentTemplate
{
    public override void WriteTitle() //error!
    {
        Console.WriteLine("Project1 document");
    }

"не может переопределить унаследованный элемент" Dynamics.DocumentTemplate.WriteTitle() ", поскольку он запечатан"

Нет ничего, кроме того, чтобы предотвратить реализацию new от него:

class Document1_FromTemplate : DocumentTemplate
{
    public new void WriteTitle() //sorry! can't stop it!
    {
        Console.WriteLine("Project1 document");
    }

Ответ 5

Вы можете использовать ключевое слово sealed двумя способами:

  • Перед классом, чтобы избежать наследования.
  • Перед функцией, чтобы избежать переопределения.

Чтобы разрешить наследование, не класть ключевое слово sealed перед классом и избегать переопределения put sealed перед функцией, которую вы не хотите переопределять.

Ответ 6

Да. вам нужно использовать закрытое переопределение для этого метода.