C# 什么时候我们真的需要调用父&x27;是否从重写方法中删除被重写的方法?

C# 什么时候我们真的需要调用父&x27;是否从重写方法中删除被重写的方法?,c#,overriding,C#,Overriding,什么时候我们真的需要从子对象的重写方法中调用父对象的重写方法 namespace MvcMovie.Models { public class MovieInitializer: DropCreateDatabaseIfModelChanges<MovieDbContext> { protected override void Seed(MovieDbContext context) { base.Seed(co

什么时候我们真的需要从子对象的重写方法中调用父对象的重写方法

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?
        }
    }
}
namespace MvcMovie.Models
{
公共类电影初始值设定项:DropCreateDatabaseIfModelChanges
{
受保护的覆盖无效种子(MovieDbContext上下文)
{
base.Seed(context);//是否需要在此处调用此父级的方法?
}
}
}

从CLR的角度来看,这不是必需的。何时需要调用它完全取决于所涉及的类和方法的作用

当您希望父方法与子方法同时运行时

例如:子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"};
    }
}
公共类父类
{
受保护的IList名称{get;set;}
公共虚拟void Addnames()
{
名称=新列表(){“A”,“B”};
}
}
公共类Child1:父类
{
public override void Addnames()
{
base.Addnames();
名称。添加(“C”);
}
}
公共类Child2:父类
{
public override void Addnames()
{
名称=新列表(){“X”、“Y”、“Z”};
}
}

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

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

例如,如果您正在扩展
集合
,但希望在添加或删除对象时触发事件,则需要重写并调用基本方法

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));
        }
    }

    ...
}
公共类恐龙:收藏
{
公共事件事件处理程序已更改;
受保护的重写void InsertItem(int索引,字符串newItem)
{
base.InsertItem(索引,newItem);
EventHandler temp=已更改;
如果(温度!=null)
{
临时(这是一种新的恐龙)(
ChangeType.Added,newItem,null));
}
}
...
}
直截了当的回答是:“你永远不知道什么时候调用基类方法”

您还可以询问基类方法的调用顺序? 在派生类实现之前或之后

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

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


希望它能有所帮助。

在我看来,总是这样,否则这表明您没有正确使用基类

基类的要点是集中类之间的公共功能。因此,基本方法的要点是提供这些类之间常见的基本行为

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

编辑:为了澄清这一点,一个基本方法应该总是完成所有派生类应该完成的工作。派生类只应添加到该行为中