4

我刚刚看到以下代码,但我不明白构造函数声明中基类的派生。这是什么,这可能与序数方法吗?

public SplashAppContext(Form mainForm, Form splashForm) : base(splashForm)
{
this.mainForm = mainForm;
splashTimer.Tick += new EventHandler(SplashTimeUp);
splashTimer.Interval = 2000;
splashTimer.Enabled = true;
}
4

6 回答 6

7

它正在调用基类构造函数,将splashForm类型的参数传递Form给它。

您也可以调用基类方法。例如,如果您重写了要稍微修改其行为的方法,则进行修改并使用base.TheMethod(). 这看起来像这样:

public override void FireMissiles()
{
   PrimeMissiles();

   base.FireMissiles();
}

如您所见,调用基类构造函数和基类方法的语法不同。

于 2010-06-18T18:41:16.617 回答
4

您列出的语法意味着此构造函数使用参数调用超类的构造函数,splashForm然后继续该对象的其余构造。当没有列出超类构造函数时,假定使用无参数构造函数,即:

public SplashAppContext(Form mainForm, Form splashForm)
{ ... }

相当于

public SplashAppContext(Form mainForm, Form splashForm) : base()
{ ... }
于 2010-06-18T18:41:52.713 回答
4

这是什么...

此行称为构造函数初始化程序。它的意思是“用参数调用基类的构造函数splashForm,然后启动这个构造函数的主体”。

当没有为构造函数显式指定构造函数初始值设定项时,假定您需要base()无参数构造函数。

...用普通方法可以吗?

对于常规方法,您当然可以调用基类方法(使用base.SomeMethod(...)),但没有可用的“初始化程序”样式。

于 2010-06-18T18:43:06.240 回答
2
: base(splashForm)

正在调用父构造函数并传递splashForm给它。

于 2010-06-18T18:41:53.263 回答
1

这实际上并不是真正的继承情况,这个语法规定的是,在调用 SplashAppContext 的构造函数之前,应该调用它的基本构造函数,并将 splashForm 作为参数传递。

于 2010-06-18T18:42:21.293 回答
1

这是调用直接父类的构造函数的语法。这是 C# 语法,而 VB.NET 要求您MyBase.New(splashForm)在构造函数的第一行代码中调用。

这是这样表达的,因为在您的子构造函数代码开始执行时,可以保证父对象已完全构造和初始化。因此,两个编译器(VB.NET 和 C#)都指定在调用父构造函数之前您不能执行任何自己的代码(如果您没有指定父构造函数并且存在无参数构造函数,它将被调用自动地)。

这种语法对于其他方法调用是不可能的(也不是必需的),因为可以通过调用base.FunctionName()您的代码来调用任何其他函数的基本实现。构造函数只是特殊情况,因为它们必须在任何其他代码之前执行。

于 2010-06-18T18:45:18.593 回答