我们什么时候真的需要从覆盖方法中调用父级的重写方法?

时间:2011-02-16 03:29:38

标签: c# override

我们什么时候真的需要从子代的覆盖方法中调用父代的重写方法?

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 个答案:

答案 0 :(得分:4)

从CLR的角度来看,这不是必需的。当您需要或需要调用它时,完全依赖于所涉及的类以及方法的作用。

答案 1 :(得分:3)

直言不讳的答案是 - “你永远不知道何时调用基类方法”。

您还可以质疑调用基类方法的顺序? 在派生类实现之前,之前或之后!!

我问了一个类似的问题,看看here

在我看来,基类不应该期望派生类调用它的方法。我的意思是,API应该以这种方式设计。 因为,如果基类期望其用户(派生类)调用其方法(在派生类实现之前或之后),那么它实际上是在假设用户。这确实是一个糟糕的API设计。

希望它会有所帮助。

答案 2 :(得分:1)

当你想要父亲的方法和孩子的

一起运行时

例如:Child 1在其列表中将包含A,B和C,因为它调用父方法,但Child 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"};
    }
}

当您希望基类执行常规函数并且子类添加到该函数时,通常会执行此操作。希望有所帮助

答案 3 :(得分:1)

如果是给定的示例,则根本没有理由覆盖该方法,因为您没有添加任何内容。

如果您要扩展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));
        }
    }

    ...
}

Source

答案 4 :(得分:1)

在我看来,总是或它是一个标志,你没有正确使用基类。

基类的重点是集中类之间的通用功能。因此,基本方法的要点是提供这些类之间通用的基本行为。

如果您正在实现应该在不同类上具有共同签名但没有共同行为的方法,那么您应该实现一个接口。

编辑:为了澄清,基本方法应该始终做所有派生类应该完成的工作的份额。派生类应仅添加到该行为。