是否可以让覆盖方法调用其抽象虚方法?

Is it possible to have an override method call its abstract virtual method?

我的目标是在派生的 classes 之一上调用 Consume 后,让抽象 class 自行更新。

想象一下:

public interface IConsumable 
{
    void Consume();
}

public abstract class AbstractConsumable : IConsumable
{
    private bool _consumed = false;

    public virtual void Consume()
    {
        _consumed = true;
    }
}

public class HealthyConsumable: AbstractConsumable
{
    public override void Consume()
    {
        // Do something healthy and ...
        base.Consume(); // Would like to avoid this...
    }
}

public class PoisonousConsumable: AbstractConsumable
{
    public override void Consume()
    {
        // Do something poisonous and ...
        base.Consume(); // Would like to avoid this...
    }
}

我想在这里实现的是不必在 override 方法上调用 base.Consume(),但仍然有抽象 class 设置 _consumed 一旦派生classes 调用他们的 Consume() 方法。

您可以使 Consume none 成为虚拟的,并在其中调用另一个受保护的虚拟(或抽象方法),它可以包含可由子 classes 更改的代码。 class 的消费者只能调用 public Consume 方法,但这将内部调用子 class 实现特定代码

public interface IConsumable 
{
    void Consume();
}

public abstract class AbstractConsumable : IConsumable
{
    private bool _consumed = false;

    public void Consume()
    {
        _consumed = true;
        InternalConsumerBehaviour();
    }

    protected virtual void InternalConsumeBehaviour()
    {
         //default do nothing could potentially mark this method abstract rather than virtual its up to you
    }
}

public class HealthyConsumable: AbstractConsumable
{
    protected override void InternalConsumeBehaviour()
    {
        // Do something healthy and ...
    }
}

public class PoisonousConsumable: AbstractConsumable
{
    protected override void InternalConsumeBehaviour()
    {
        // Do something poisonous and ...
    }
}

如果我理解你的问题,你可以这样做:

public interface IConsumable 
{
    void Consume();
}

public abstract class AbstractConsumable : IConsumable
{
    private bool _consumed = false;

    public abstract void ConsumeEffects();

    public void Consume()
    {
        this.ConsumeEffects();
        _consumed = true;
    }
}

public class HealthyConsumable: AbstractConsumable
{
    public override void ConsumeEffects()
    {
        // Do something healthy and ...
        // Consume will get called in the base
    }
}

public class PoisonousConsumable: AbstractConsumable
{
    public override void ConsumeEffects()
    {
        // Do something poisonous and ...
        // Consume will get called in the base
    }
}