基于基本代码时是否可以跳过覆盖的方法代码

本文关键字:代码 覆盖 方法 于基本 是否 | 更新日期: 2023-09-27 18:30:52

我得到了快速的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 语句,我不想继续。我只是想知道这是否可能。谢谢:)

基于基本代码时是否可以跳过覆盖的方法代码

您似乎正在寻找模板方法模式,也称为钩子方法

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

如果要强制所有基类实现挂钩,请将该方法抽象化。否则,如果实现钩子是可选的,请将其定义为空方法,就像我上面所做的那样。

这种模式采用了一个非常强大的原则:好莱坞原则。不要打电话给我们,我们会打电话给你!派生类不会调用基类,如示例中所示 - 相反,基类将调用派生类(如果适用)。

更改方法以返回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;
    }
}