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?
为什么要这样做,它实现了什么?似乎没有任何意义.
此代码使您可以覆盖Execute方法.
请记住,正常实现的接口方法是公共的(而不是虚拟或抽象),因此您不能在派生类中覆盖它,并且IController默认情况下不能通过接口创建新的Execute方法(没有此接口到受保护的虚拟技术).通过创建一个受保护的虚拟方法(您从明确实现的接口方法调用)允许派生类重写Execute方法不破坏接口的实现.
我在这里找到了一篇很好的文章: C#覆盖子类中的接口方法