Можно ли предотвратить переопределение унаследованного виртуального метода в подклассах? - PullRequest
14 голосов
/ 04 сентября 2008

у меня некоторые классы выложены вот так

class A
{
    public virtual void Render()
    {
    }
}
class B : A
{
    public override void Render()
    {
        // Prepare the object for rendering
        SpecialRender();
        // Do some cleanup
    }

    protected virtual void SpecialRender()
    {
    }
}
class C : B
{
    protected override void SpecialRender()
    {
        // Do some cool stuff
    }
}

Можно ли предотвратить переопределение класса C методом Render, не нарушая следующий код?

A obj = new C();
obj.Render();       // calls B.Render -> c.SpecialRender

Ответы [ 6 ]

32 голосов
/ 04 сентября 2008

Вы можете запечатать отдельные методы для предотвращения их переопределения:

public sealed override void Render()
{
    // Prepare the object for rendering        
    SpecialRender();
    // Do some cleanup    
}
2 голосов
/ 04 сентября 2008

Да, вы можете использовать ключевое слово sealed в реализации класса B для Render:

class B : A
{
    public sealed override void Render()
    {
        // Prepare the object for rendering
        SpecialRender();
        // Do some cleanup
    }

    protected virtual void SpecialRender()
    {
    }
}
1 голос
/ 04 сентября 2008

попробуй sealed

class B : A
{
  protected sealed override void SpecialRender()
  {
    // do stuff
  }
}

class C : B
  protected override void SpecialRender()
  {
    // not valid
  }
}

Конечно, я думаю, что C может обойти это, будучи new.

1 голос
/ 04 сентября 2008

В Б сделать

protected override sealed void Render() { ... }
0 голосов
/ 04 сентября 2008

Другим (лучшим?) Способом является вероятное использование нового ключевого слова для предотвращения повторного определения конкретного виртуального метода:

class A
{
    public virtual void Render()
    {
    }
}
class B : A
{
    public override void Render()
    {
        // Prepare the object for rendering       
        SpecialRender();
        // Do some cleanup    
    }
    protected virtual void SpecialRender()
    {
    }
}
class B2 : B
{
    public new void Render()
    {
    }
}
class C : B2
{
    protected override void SpecialRender()
    {
    }
    //public override void Render() // compiler error 
    //{
    //}
}
0 голосов
/ 04 сентября 2008

да. Если вы пометите метод как Sealed, он не может быть переопределен в производном классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...