Когда нам действительно нужно вызывать переопределенный метод родителя из переопределенного метода? - PullRequest
3 голосов
/ 16 февраля 2011

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

namespace MvcMovie.Models
{
    public class MovieInitializer: DropCreateDatabaseIfModelChanges<MovieDbContext>
    {
        protected override void Seed(MovieDbContext context)
        {
            base.Seed(context);// is it necessary to invoke this parent's method here?
        }
    }
}

Ответы [ 5 ]

4 голосов
/ 16 февраля 2011

Это не требуется с точки зрения CLR.Когда вы хотите или должны вызывать, это зависит полностью от участвующих классов и того, что делают методы.

3 голосов
/ 16 февраля 2011

Прямой ответ - «вы никогда не знаете, когда вызывать метод базового класса».

Вы также можете подвергнуть сомнению порядок вызова метода базового класса? как до, после или после реализации производного класса !!

Я задавал похожий вопрос, посмотрите здесь .

По моему мнению, базовый класс не должен ожидать, что производный класс вызовет свой метод. Я имею в виду, API должен быть разработан таким образом. Поскольку, если базовый класс ожидает, что его пользователи (производные классы) будут вызывать свой метод обратно (до или после реализации производного класса), то он фактически делает предположение о пользователях. Что действительно является плохим дизайном API.

Надеюсь, это поможет.

1 голос
/ 13 июня 2016

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

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

Если вы реализуете методы, которые должны иметь общую сигнатуру для разных классов, но без общего поведения, вам следует реализоватьинтерфейс.

РЕДАКТИРОВАТЬ: Чтобы уточнить, базовый метод всегда должен выполнять ту часть работы, которую должны выполнять все производные классы.Производные классы должны только ДОБАВЛЯТЬ это поведение.

1 голос
/ 16 февраля 2011

Если это данный пример, нет никакой причины переопределять метод вообще, потому что вы ничего не добавляете.

Примером того, когда вы захотите переопределить и вызвать базовый метод, будет, если вы расширяете Collection<T>, но вы хотите инициировать события, когда объекты добавляются или удаляются.

public class Dinosaurs : Collection<string>
{
    public event EventHandler<DinosaursChangedEventArgs> Changed;

    protected override void InsertItem(int index, string newItem)
    {
        base.InsertItem(index, newItem);

        EventHandler<DinosaursChangedEventArgs> temp = Changed;
        if (temp != null)
        {
            temp(this, new DinosaursChangedEventArgs(
                ChangeType.Added, newItem, null));
        }
    }

    ...
}

Источник

1 голос
/ 16 февраля 2011

Когда вы хотите, чтобы метод родителя запускался так же, как и дочерний

например: ребенок 1 будет иметь A, B и C в своем списке, так как он вызывает метод родителя, но ребенок 2 будет иметь только X, Y Z.

public class Parent
{
    protected IList<string> Names {get;set;}
    public virtual void Addnames()
    {
         Names = new List<string>(){"A", "B"};
    }
}

public class Child1 : Parent
{
    public override void Addnames()
    {
         base.Addnames();
         Names.Add("C");
    }
}

public class Child2 : Parent
{
    public override void Addnames()
    {
         Names = new List<string>(){"X", "Y", "Z"};
    }
}

Обычно вы делаете это, когда хотите, чтобы базовый класс выполнял общие функции, а дочерний класс добавляет к этому. Надеюсь, это поможет

...