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
关键字明确表示应隐藏基类方法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