Я присоединяюсь к унаследованному проекту в моей компании - веб-сайту предприятия, разработанному с помощью ASP.NET MVC.Почему нам нужно вызвать пустой виртуальный метод родительского класса в 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);
В чем смысл этого? Почему он делает вызов пустого метода родительского класса?
Это просто показывает вам определение, а не реализацию. Обратите внимание на ';' в конце. См. [Здесь] (https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/DefaultModelBinder.cs#L544) – Rob
Привет @Rob Я считаю, что точка вызова родительский метод заключается в том, чтобы данные обрабатывались/потреблялись логикой в родительском методе. Однако в этом конкретном случае существует только определение метода (как вы указали), и нет конкретной реализации. Тогда зачем вообще называть его? –
Существует только определение метода, доступное для вас * для проверки *, но это не значит, что реализация отсутствует. Большая часть стека .NET была закрыта источником (по крайней мере до недавнего времени). Поэтому, пока вы можете видеть, какие методы доступны, вы не можете видеть исходный код внутри метода. То, что вы видите, это просто определения метода (т. Е. То, что класс позволяет вам делать), но не то, как он это делает. См. Мою ссылку на исходный код (в зависимости от вашей версии, она может немного меняться). – Rob