在C#中,如果我有一个继承自另一个对象的对象,并且继承的对象有一个与基础对象同名的函数,如果我想在继承的对象时调用基础对象的函数#39;调用了函数,我应该使用new关键字吗?如果没有,那么调用这两个函数的最佳方法是什么?
以下是一个例子:
public partial class FormTest : Form
{
public new void Refresh()
{
TestFunction();
}
}
基本上,我在询问调用Refresh
对象的Form
函数时是否也调用Refresh
对象的FormTest
函数。此外,Refresh
对象的Form
函数是第一个调用的,或者在Refresh
对象的FormTest
函数之后调用。
答案 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,但是你也会得到编译器警告(因为你可能不知道你是 隐藏基类方法中的方法,或者你可能想要覆盖它,而只是忘了 包括关键字)。
答案 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