C# 基于基代码时,是否可以跳过重写的方法代码

C# 基于基代码时,是否可以跳过重写的方法代码,c#,overriding,virtual,C#,Overriding,Virtual,我有一个很快的问题。 如果我有这样的方法 protected virtual void Delete(Guid? guidId) { } protected override void Delete(Guid? id) { if (id != null) { code goes here } } protected virtual void Delete(Guid?

我有一个很快的问题。 如果我有这样的方法

    protected virtual void Delete(Guid? guidId)
    {
    }
    protected override void Delete(Guid? id)
    {
        if (id != null)
        {
          code goes here 
        }
    }
    protected virtual void Delete(Guid? guidId)
    { 
        if (id != null)
        {
          code goes here 
        }
    }
    protected override void Delete(Guid? id)
    {
      base.Delete(id);
      code goes here  
    }
然后我像这样覆盖它

    protected virtual void Delete(Guid? guidId)
    {
    }
    protected override void Delete(Guid? id)
    {
        if (id != null)
        {
          code goes here 
        }
    }
    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语句放在基方法中

    protected virtual void Delete(Guid? guidId)
    {
    }
    protected override void Delete(Guid? id)
    {
        if (id != null)
        {
          code goes here 
        }
    }
    protected virtual void Delete(Guid? guidId)
    { 
        if (id != null)
        {
          code goes here 
        }
    }
    protected override void Delete(Guid? id)
    {
      base.Delete(id);
      code goes here  
    }
然后像这样称呼它

    protected virtual void Delete(Guid? guidId)
    {
    }
    protected override void Delete(Guid? id)
    {
        if (id != null)
        {
          code goes here 
        }
    }
    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语句,我不想继续。
我只是想知道这是否可能。谢谢:)

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

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

看起来您正在寻找一种方法,通常也称为hook方法

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


这种模式采用了一个非常强大的原则:。别打电话给我们,我们会打电话给你的!派生类不会像您的示例中那样调用基类-相反,基类会在适当的情况下调用派生类。

您似乎在寻找,也就是通常所说的钩子方法

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


这种模式采用了一个非常强大的原则:。别打电话给我们,我们会打电话给你的!派生类不会像您的示例中那样调用基类-相反,基类会在适当的情况下调用派生类。

让方法返回布尔值是一个简单的解决方法。为什么不在派生类中重新检查此条件?@HimBromBeere,因为id不能为null,通过调用base进行检查,我的带有大量嵌套if的大型delete方法将减少一个缩进。让该方法返回bool是一个简单的解决方法。为什么不在派生类中重新检查这个条件?@HimBromBeere,因为id不能为null,通过调用base进行检查,我的大删除方法有很多嵌套的if,将减少一个缩进。谢谢你的快速回复。我很感激,我决定坚持使用if(id!=null),因为在我的情况下不需要返回任何东西。然而,我从这篇文章中学到了一个有趣的小方法:)谢谢你的快速回复。我很感激,我决定坚持使用if(id!=null),因为在我的情况下不需要返回任何东西。然而,我从这篇文章中学到了一个有趣的小方法:)谢谢你的回复。它看起来很有趣,但我不太明白它是如何工作的。因为override void OnDelete在任何时候都不会从基中调用Delete来查看该id是否为null。你能详细介绍一下吗?我想知道在ovveride OnDelete中我应该做些什么来确保“如果”检查已经完成。我希望protectedoverrideovoidondelete(Guid?Guid){}如果Guid为null,它将跳出该方法,相反,如果我在其中调用Delete,无论发生什么情况,它都将转到下一行。希望这是有意义的。@adminSoftDK基类上的
Delete
方法为您进行检查。
OnDelete
方法只有在id不为空时才会被调用,因此您可以将您的业务逻辑转储到
OnDelete
覆盖中,而不必担心检查id。对于像您这样的场景,这是一种非常好的模式,WPF、WinForms、WinRT等框架都可以使用它(例如,
OnPageLoaded
hooks)。此外,您现在可能可以将
Delete
作为一个私有方法。基类不需要调用它。它看起来是一个很好的模式(我从来没有听说过),因为我正在到处检查类似的空值(在WPF中)。但是我仍然看不出有什么区别(调用)要执行的删除方法。我想我只需要从您提供的链接开始阅读此模式:)@adminSoftDK在您的原始代码中,谁在调用
Delete
方法?您好,谢谢您的回复。它看起来很有趣,但我不太明白它是如何工作的。因为override void OnDelete在任何时候都不会从基中调用Delete来查看该id是否为null。你能详细介绍一下吗?我想知道在ovveride OnDelete中我应该做些什么来确保“如果”检查已经完成。我希望protectedoverrideovoidondelete(Guid?Guid){}如果Guid为null,它将跳出该方法,相反,如果我在其中调用Delete,无论发生什么情况,它都将转到下一行。希望这是有意义的。@adminSoftDK基类上的
Delete
方法为您进行检查。
OnDelete
方法只有在id不为空时才会被调用,因此您可以将您的业务逻辑转储到
OnDelete
覆盖中,而不必担心检查id。对于像您这样的场景,这是一种非常好的模式,WPF、WinForms、WinRT等框架都可以使用它(例如,
OnPageLoaded
hooks)。此外,您现在可能可以将
Delete
作为一个私有方法。基类不需要调用它。它看起来是一个很好的模式(我从来没有听说过),因为我正在到处检查类似的空值(在WPF中)。但是我仍然看不出有什么区别(调用)要执行的Delete方法。我想我只需要从您提供的链接开始了解此模式:)@adminSoftDK在您的原始代码中,谁在调用
Delete
方法?