什么时候应该在重写方法中调用base.Method(),以及在团队中编写代码时如何标记?

Ale*_*sev 24 c# virtual overriding

当使用一些框架/ api时,有时候你不清楚是否必须调用base.Method如果你覆盖它,例如你可以非常肯定你应该在覆盖事件调用器时调用base.Maethod()来传播事件在其他情况下,特别是当没有可用的源代码且没有评论时,它可能不那么清楚.

我wounder其他程序员如何决定他们应该调用基方法或没有在这种情况下,如果你是要写一些框架如何通知你期望的基础方法,在虚拟的成员被称为与否其他程序员.

Ale*_*sev 19

现在我不认为覆盖方法的类的消费者应该需要调用base.Method().代码应该以不会被破坏的方式编写.

public class MyBase
{
    private void FooInternal()
    {
        DoRequiredStuff();
        Foo();
    }
    public virtual void Foo() {}
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ran 9

如果您要求您的类的消费者必须实现特定方法的功能,则该方法应标记为抽象.

如果您的类的使用者应该可选地提供特定方法的功能,那么该方法应该是虚拟的.

实际上没有办法要求类的使用者在虚方法上调用base.Method().这真的取决于背景.如果base.Method()执行了一些你不得不做的工作,你应该调用base.Method(),如果这样可以节省一些开发时间/它在该上下文中是有意义的.


小智 7

这取决于是否需要使用底层功能.

例如,如果基础对象具有一些需要运行的通用数据库功能,请在最后调用基本方法.如果您的代码覆盖了基本方法将设置的一些属性,那么首先调用基本方法.

如果没有源代码或文档,RedGate的.Net Reflector(http://www.red-gate.com/products/dotnet-development/reflector/)可以解压缩您尝试使用的程序集,您可以看到代码有效.

  • [DotPeek](http://www.jetbrains.com/decompiler/)将是RedGate的.NET Reflector的免费替代品(它更好的imo,我有两个,我发现自己只使用DotPeek). (2认同)