New 关键字是否调用继承对象的函数

本文关键字:对象 函数 继承 调用 关键字 是否 New | 更新日期: 2023-09-27 17:56:26

在 C# 中,如果我有一个从另一个对象继承的对象,并且继承的对象有一个与基对象同名的函数,如果我想在调用继承对象的函数时调用基对象的函数,我应该使用 new 关键字吗?如果不是,调用这两个函数的最佳方法是什么?

下面是一个示例:

public partial class FormTest : Form
{
    public new void Refresh()
    {
        TestFunction();
    }
}

基本上,我问的是当调用FormTest对象的Refresh函数时,是否也会调用Form对象的Refresh函数。此外,Form对象的Refresh函数是首先调用,还是在FormTest对象的Refresh函数之后调用。

New 关键字是否调用继承对象的函数

使用 new 关键字明确表示应隐藏基类方法Refresh。 在这种情况下Refresh不会调用基类的方法。为了调用基类方法Refresh FormTest类的方法中使用base.Refresh()

如果我想在继承时调用基对象的函数 对象的函数被调用,我应该使用 new 关键字吗?

不。 New关键字用于隐藏父类中的方法。这绝对不是你需要的。您应该重写子类中的 Refresh 方法,并使用base关键字调用Form.Refresh方法。

public partial class FormTest : Form
{
    public override void Refresh()
    {
        TestFunction();
        base.Refresh();
    }
}

如果使用 new 关键字而不是 override ,则 派生类不会重写基类中的方法,它只是 隐藏它。在这种情况下,代码如下:

public class Base
{
    public virtual void SomeOtherMethod()
    {
      Console.WriteLine("Base some method");
    }
}
public class Derived : Base
{
    public new void SomeOtherMethod()
    {
      Console.WriteLine("Derived some method");
    }
}    
Base b = new Derived();
Derived d = new Derived();
b.SomeOtherMethod();
d.SomeOtherMethod();

输出
基于一些方法
派生了一些方法

如果未指定新建或替代,则生成的输出相同就像您指定了 new,但您还会收到编译器警告(因为您可能不知道您是在基类方法中隐藏方法,或者您可能确实想要重写它,只是忘记了包括关键字)。

覆盖和新建之间的区别

你完全误解了虚拟和覆盖。重写派生类中的虚拟方法时,当您通过派生类实例调用时,它将永远不会调用基类方法。

在您的情况下,如果 Refresh 方法在 Form 类中是虚拟的,如下所示:

public partial class Form
{
    public virtual void Refresh()
    {
        TestFunction();
    }
}

现在,如果您在TestForm中覆盖它,并且如果您通过TestForm的实例调用它,它将调用TestForm的刷新方法。

public partial class TestForm : Form
{
   public override void Refresh()
   {
        TestFunction();
    }
}

现在,如果您像这样运行它:

   Form form = new TestForm();
   form.Refresh(); // TestForm Reresh method will be called
   TestForm form = new TestForm();
   form.Refresh(); // TestForm Reresh method will be called

如果您不覆盖并使用 new 关键字,则情况会有所不同:

public partial class TestForm : Form
{
   public new void Refresh()
   {
        TestFunction();
    }
}

现在,如果您调用它们,您将看到不同的结果:

   Form form = new TestForm();
   form.Refresh(); // Form Reresh method will be called
   TestForm form = new TestForm();
   form.Refresh(); // TestForm Reresh method will be called