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
方法?