基于基本代码时是否可以跳过覆盖的方法代码
本文关键字:代码 覆盖 方法 于基本 是否 | 更新日期: 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;
}
}