C # не поддерживает автоматическое принудительное выполнение этого, но вы можете применить его, используя шаблон метода шаблона .Например, представьте, что у вас есть этот код:
abstract class Animal
{
public virtual void Speak()
{
Console.WriteLine("I'm an animal.");
}
}
class Dog : Animal
{
public override void Speak()
{
base.Speak();
Console.WriteLine("I'm a dog.");
}
}
Проблема здесь в том, что любой класс, унаследованный от Animal
, должен вызывать base.Speak();
для обеспечения выполнения базового поведения.Вы можете автоматически применить это, используя следующий (немного другой) подход:
abstract class Animal
{
public void Speak()
{
Console.WriteLine("I'm an animal.");
DoSpeak();
}
protected abstract void DoSpeak();
}
class Dog : Animal
{
protected override void DoSpeak()
{
Console.WriteLine("I'm a dog.");
}
}
В этом случае клиенты по-прежнему видят только полиморфный метод Speak
, но поведение Animal.Speak
гарантированно будет выполнено.Проблема в том, что если у вас есть дальнейшее наследование (например, class Dachshund : Dog
), вам нужно создать еще один абстрактный метод, если вы хотите, чтобы гарантированно выполнялось Dog.Speak
.