Предотвращение переопределения отдельных методов в C # - PullRequest
34 голосов
/ 11 марта 2011

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

Ответы [ 6 ]

39 голосов
/ 11 марта 2011

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

34 голосов
/ 11 марта 2011

Вы также можете использовать модификатор sealed, чтобы предотвратить переопределение метода производным классом.

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

14 голосов
/ 11 марта 2011

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

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

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

9 голосов
/ 18 марта 2011

Вы можете получить ключевое слово 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");
    }
6 голосов
/ 11 марта 2011

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

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

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

1 голос
/ 11 марта 2011

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

...