Вы не можете применить это, но вы можете сделать это с помощью вызова, подобного base.Foo(bar)
. base
позволяет получить доступ к членам класса, от которого вы наследуете.
Вы можете принудительно применить это поведение, используя шаблон метода шаблона . Например, представьте, что у вас есть этот код:
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 Dachsund : Dog
), вам нужно создать еще один абстрактный метод, если вы хотите, чтобы гарантированно выполнялось Dog.Speak
.