New关键字是否会调用继承对象的功能?

时间:2016-07-12 11:48:59

标签: c# inheritance

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

以下是一个例子:

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

基本上,我在询问调用Refresh对象的Form函数时是否也调用Refresh对象的FormTest函数。此外,Refresh对象的Form函数是第一个调用的,或者在Refresh对象的FormTest函数之后调用。

4 个答案:

答案 0 :(得分:1)

使用new关键字明确指出应隐藏基类方法Refresh。在这种情况下,不会调用基类的Refresh方法。要调用基类方法,请在base.Refresh()类的Refresh方法中使用FormTest

答案 1 :(得分:1)

  

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

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

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

答案 2 :(得分:0)

  

如果您使用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或覆盖,则结果输出相同 好像你指定了new,但是你也会得到编译器警告(因为你可能不知道你是 隐藏基类方法中的方法,或者你可能想要覆盖它,而只是忘了 包括关键字)。

Difference between override and new

答案 3 :(得分:0)

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

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

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

现在如果你在TestForm中覆盖它,如果你通过TestForm的实例调用它,它将调用TestForm的Refresh方法。

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