在构造函数中使用inheritance(publix X():y)
我刚刚看到下面的代码,但我不理解构造函数声明中的基类派生。 这是什么,这可能与序数方法有关吗?
public SplashAppContext(Form mainForm, Form splashForm) : base(splashForm) { this.mainForm = mainForm; splashTimer.Tick += new EventHandler(SplashTimeUp); splashTimer.Interval = 2000; splashTimer.Enabled = true; }
它调用一个基类构造函数,将Form
类型的参数splashForm
传递给它。
您也可以调用基类方法。 例如,如果您重写了一个要稍微修改的行为的方法,则进行修改并使用base base.TheMethod()
调用基类方法。 这看起来像这样:
public override void FireMissiles() { PrimeMissiles(); base.FireMissiles(); }
您可以看到,调用基类构造函数和基类方法的语法不同。
您列出的语法意味着此构造函数在继续此对象的其余构造之前使用参数splashForm
调用超类的构造函数。 如果未列出超类构造函数,则假定为no-arg构造函数,即:
public SplashAppContext(Form mainForm, Form splashForm) { ... }
相当于
public SplashAppContext(Form mainForm, Form splashForm) : base() { ... }
这是什么…
该行称为构造函数初始值设定项 。 它意味着“使用参数splashForm
调用基类的构造splashForm
,然后启动此构造函数的主体”。
如果没有为构造函数显式指定构造函数初始值设定项,则假定您需要base()
,无参数构造函数。
……用普通的方法可以吗?
对于常规方法,您当然可以调用基类方法(使用base.SomeMethod(...)
),但是没有“初始化”样式可用。
: base(splashForm)
调用父构造函数并将splashForm
传递给它。
这实际上并不是inheritance的情况,这个语法指定的是在调用SplashAppContext的构造函数之前,应该使用splashForm作为参数调用其基本构造函数。
这是调用直接父类的构造函数的语法。 这是C#语法,而VB.NET要求您调用MyBase.New(splashForm)
作为构造函数中的第一行代码。
这是以这种方式表达的,因为父对象保证在子构造函数代码开始执行时完全构造和初始化。 因此,两个编译器(VB.NET和C#)都指定在调用父构造函数之前不执行任何自己的代码(如果没有指定父构造函数,并且存在无参数构造函数,则会调用它自动)。
这种语法对于其他方法调用是不可能的(也不是必需的),因为可以通过在代码中调用base.FunctionName()
来调用任何其他函数的基本实现。 构造函数只是特殊情况,因为它们必须在任何其他代码之前执行。