【发布时间】:2016-04-21 00:06:42
【问题描述】:
我正在加入我公司的一个遗留项目,一个使用 ASP.NET MVC 开发的企业网站。
由于我是 C# 和框架的新手(我来自 Java 背景),我无法理解这段特定的代码:
internal sealed class ValidatingModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
base.OnModelUpdated(controllerContext, bindingContext); // This is the damn call I'm stuck with
var model = bindingContext.Model as IValidatableObject;
if (model != null)
{
ValidateModel(model, bindingContext.ModelState);
}
}
// more methods below...
}
现在,我想知道base.OnModelUpdated(....) 调用是做什么的,所以我继续定义DefaultModelBinder,结果发现OnModelUpdated() 是一个虚方法,为空方法体:
protected virtual void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext);
这有什么意义? 为什么要调用父类的空方法?
【问题讨论】:
-
它只是向您展示定义,而不是实现。注意最后的
;。见here -
嗨@Rob我相信调用父方法的目的是让父方法中的逻辑处理/使用数据。但是,在这种特殊情况下,只有一个方法定义(正如您所指出的),没有具体的实现。那为什么要首先调用它呢?
-
只有方法定义可供您检查,但这并不意味着没有实现。 .NET 堆栈的大部分是封闭源代码的(至少直到最近)。因此,虽然您可能会看到可用的方法,但您看不到方法内的源代码。您所看到的只是方法定义(即类允许您做什么),而不是它是如何做的。请参阅我上面指向实际源代码的链接(取决于您的版本,可能会略有不同)。
-
谢谢@Rob,这解释得很好:)
标签: c# asp.net asp.net-mvc inheritance virtual-functions