是否可以在基于基本代码时跳过重写的方法代码

时间:2014-11-18 10:57:10

标签: c# override virtual

我得到了快速的c#问题。 如果我有这样的方法

    protected virtual void Delete(Guid? guidId)
    {
    }

然后我像这样覆盖它

    protected override void Delete(Guid? id)
    {
        if (id != null)
        {
          code goes here 
        }
    }

我可以将if语句放在基本方法中,就像这样

    protected virtual void Delete(Guid? guidId)
    { 
        if (id != null)
        {
          code goes here 
        }
    }

然后像这样称呼它

    protected override void Delete(Guid? id)
    {
      base.Delete(id);
      code goes here  
    }

但是现在在重写的方法中,如果基本方法没有进入if语句,我不想​​继续。 我只是想知道这是否可行。谢谢:))

2 个答案:

答案 0 :(得分:2)

更改方法以返回bool以指示是否已采取分支,例如:

class Base
{
    protected virtual bool Delete(Guid? id)
    {
        bool result = false;

        if (id != null)
        {
            // ...

            result = true;
        }

        return result;
    }
}

internal class Derived : Base
{
    protected override bool Delete(Guid? id)
    {
        if (!base.Delete(id))
            return false;

        // ...

        return true;
    }
}

答案 1 :(得分:2)

您似乎正在寻找Template Method pattern,通常也称为挂钩方法

public class Base 
{
    protected void Delete(Guid? id)
    { 
        if (id != null)
        {
           //code goes here

           //execute hook only if id is not null
           OnDelete(id);
        }
    }

    protected virtual void OnDelete(Guid? guid) {}
}


public class Derived : Base
{
    protected override void OnDelete(Guid? guid)
    {
        //code goes here
    }
}

如果要强制所有基类实现钩子,请将该方法设为抽象。 否则,如果实现钩子是可选的,请将其定义为空方法,如上所述。

这种模式采用了一个非常强大的原则:Hollywood principle别打电话给我们,我们会给你打电话!派生类并没有像你的例子那样调用基类 - 相反,基类会调用派生类class if 合适。