Могу ли я предотвратить переопределение унаследованного виртуального метода в подклассах?
-
09-06-2019 - |
Вопрос
У меня есть несколько классов, распределенных следующим образом
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
Решение
Вы можете запечатать отдельные методы, чтобы предотвратить их переопределение:
public sealed override void Render()
{
// Prepare the object for rendering
SpecialRender();
// Do some cleanup
}
Другие советы
Да, вы можете использовать ключевое слово sealed в реализации Render класса B.:
class B : A
{
public sealed override void Render()
{
// Prepare the object for rendering
SpecialRender();
// Do some cleanup
}
protected virtual void SpecialRender()
{
}
}
В B, делайте
protected override sealed void Render() { ... }
попробуй sealed
class B : A
{
protected sealed override void SpecialRender()
{
// do stuff
}
}
class C : B
protected override void SpecialRender()
{
// not valid
}
}
Конечно, я думаю, что C может обойти это, будучи new
.
ДА.Если вы пометите метод как Запечатанный, то он не может быть переопределен в производном классе.
Другой (лучший?) вероятно, это использование ключевого слова new, чтобы предотвратить переопределение конкретного виртуального метода:
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
//{
//}
}
Не связан с StackOverflow