2015-06-03 5 views
1

относительно виртуального метода:Виртуальный метод вызывается с помощью базы

protected internal virtual void PopulateGetParameters(
    int id, List<SqlParameter> parameters) 
{ 
} 

Который быть переопределен в классе наследования базового класса. Что меня сбивает с толку, так это метод переопределения виртуального метода?

protected override void PopulateGetParameters(
    int id, List<SqlParameter> parameters) 
{ 
    base.PopulateGetParameters(id, parameters); 
    parameters.Add(new SqlParameter(this.KeyParamName, id)); 
} 

Видя, что виртуальные методы предназначены для переопределения. Какова цель вызова base.PopulateGetParameters(id, parameters);? Я также не могу понять, где происходит реализация. base.PopulateGetParameters - это пустой метод virtual, и переопределение его вызывает по какой-то причине.

ответ

2

Ключевое слово virtual использовано только для . Разрешить метод, подлежащий переопределению.

В C# по умолчанию методы не являются виртуальными, и вы не можете переопределить не виртуальный метод. Это противоположность Java, где по умолчанию все методы являются виртуальными.

В вашем случае вызов базовой реализации метода просто ничего не значит, потому что он пуст. Но в любом случае вполне можно назвать это, и на самом деле это очень распространено.

Дополнительная информация here.

2

Виртуальный метод может быть отменен при необходимости. Там нет никаких правил против:

(а) не делает так,

(б) не призывают в base реализации.

Поскольку в этом случае реализация базового класса ничего не делает, было бы лучше создать интерфейс и определить там PopulateGetParameters. Тогда вызов base становится невозможным, а не бессмысленным, поскольку в настоящее время он находится в вашем примере кода.

Смежные вопросы