【问题标题】:Is it possible to have an override method call its abstract virtual method?是否可以让覆盖方法调用其抽象虚拟方法?
【发布时间】:2017-11-15 23:01:56
【问题描述】:

我的目标是在派生类之一上调用 Consume 时自行更新 Abstract 类。

想象一下:

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(),但是一旦派生类调用它们的Consume() 方法,仍然有抽象类集_consumed

【问题讨论】:

  • 与其说你认为你的问题很明显,而且你实际上不需要问一个问题,你实际上应该问一个问题,并解释你实际上想要做什么.试图让人们猜测你真正想要什么并不好。
  • 我已经更新了问题,所以这是一个问题。

标签: c# overriding virtual abstract


【解决方案1】:

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

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 ...
    }
}

【讨论】:

  • 也谢谢你!与@d219 提供的答案或多或少相同。不确定现在将谁标记为答案:P
  • @d219 的回答公开了消耗效果,这意味着有人可以在不调用消耗的情况下调用它,因此永远不会设置 _consumed。它是次要的,我只是为了你而指出它,我不介意你想接受哪个答案
【解决方案2】:

如果我理解你的要求,你可以这样做:

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
    }
}

【讨论】:

  • 这正是我想要的。一旦我看到它,非常明显的解决方案。谢谢!
猜你喜欢
  • 2014-03-18
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多