【问题标题】:Overriding and New [duplicate]覆盖和新建[重复]
【发布时间】:2015-04-16 18:06:21
【问题描述】:

我不确定这是否更适合 SE 上的程序员。

我正在学习继承,特别是如何使用覆盖 - 我可以看到我可以使用覆盖来扩展功能或使用 new 来创建新功能。

EG

    public override int Calls(int i)
    {
        //Do some things
        return base.Calls(i);
    }

上面做逻辑,然后调用基类。

如果我做新的

    public new int Calls(int i)

然后我可以实现自己的逻辑,就好像基类从未存在过(因为它从未被调用过)。

让我感到困惑的是我可以简单地从我的覆盖方法中删除基类调用,我认为我得到的结果与新的相同。意义

public override int Calls(int i)
{
    //Do some things
    // return base.Calls(i); COMMENTED OUT, no base class call
}

上面的代码sn-p肯定和public new int Calls(int i)是一样的

我的问题是,我是对的吗 - 这最终是两种做同一件事的方法,因此它在开发人员的清晰度方面变得更好(通过使用覆盖或新),或者这两种方法之间是否存在任何其他差异(任何问题)。

【问题讨论】:

  • 您是否尝试过通过声明为基类的变量调用Calls 方法?
  • 它们不是一回事。尝试谷歌搜索“覆盖与新 c#”。

标签: .net


【解决方案1】:

new 和 override 之间存在巨大的差异。

在覆盖的情况下,无论您持有的是基类对象还是派生类型的对象,都会调用这个被覆盖的方法。

然而,如果您持有派生类的对象,则调用派生类的方法。 “新”是你应该非常小心的东西,我只是不使用它。

【讨论】:

  • 没有理由不使用new。如果您的子类碰巧与其父类具有相同的方法名称(并且它们不相关),编译器实际上鼓励您添加 new 关键字,以便它们不相关的事实将是明确的。我会说你最好尽量避免名称冲突,而不是避免 new
猜你喜欢
  • 2012-02-16
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 2011-05-13
相关资源
最近更新 更多