这段代码有什么意义?

Mik*_*ley 9 implementation interface asp.net-mvc-3

我正在阅读ASP.NET MVC3的源代码,我在ControllerBase的代码中遇到了以下内容:

public interface IController
{
    void Excecute(RequestContext requestContext);
}


public abstract class ControllerBase : IController
{

    protected virtual void Execute(RequestContext requestContext)
    {
        if (requestContext == null)
        {
            throw new ArgumentNullException("requestContext");
        }
        if (requestContext.HttpContext == null)
        {
            throw new ArgumentException(MvcResources.ControllerBase_CannotExecuteWithNullHttpContext, "requestContext");
        }

        VerifyExecuteCalledOnce();
        Initialize(requestContext);

        using (ScopeStorage.CreateTransientScope())
        {
            ExecuteCore();
        }
    }

    void IController.Execute(RequestContext requestContext)
    {
        Execute(requestContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

ControllerBase提供了一个实现Execute,但它有一些提供...的定义IController.Execute

为什么要这样做,它实现了什么?似乎没有任何意义.

Ben*_*yne 6

此代码使您可以覆盖Execute方法.

请记住,正常实现的接口方法是公共的(而不是虚拟或抽象),因此您不能在派生类中覆盖它,并且IController默认情况下不能通过接口创建新的Execute方法(没有此接口到受保护的虚拟技术).通过创建一个受保护的虚拟方法(您从明确实现的接口方法调用)允许派生类重写Execute方法不破坏接口的实现.

我在这里找到了一篇很好的文章: C#覆盖子类中的接口方法

  • @Scott使用public virtual将允许从该类外部访问它而无需引用IController接口.它是公开的.使用protected会使您的方法保持在ControllerBase类及其后代内部,除非您有对IController接口的显式引用.因此它受到更好的保护,仅在非常有意义的时候使用. (2认同)