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