コンストラクターで継承を使用する(publix x():y)
-
28-09-2019 - |
質問
次のコードを見たばかりですが、コンストラクター宣言の基本クラスの導出がわかりません。これは何であり、これは序数の方法で可能ですか?
public SplashAppContext(Form mainForm, Form splashForm) : base(splashForm)
{
this.mainForm = mainForm;
splashTimer.Tick += new EventHandler(SplashTimeUp);
splashTimer.Interval = 2000;
splashTimer.Enabled = true;
}
解決
それは基本クラスのコンストラクターを呼び出して、議論を渡しています splashForm
タイプの Form
それに。
ベースクラスのメソッドも呼び出すことができます。たとえば、わずかに変更したい動作をオーバーライドした場合、変更を行い、ベースクラスのメソッドを呼び出します base.TheMethod()
. 。これは次のようになります:
public override void FireMissiles()
{
PrimeMissiles();
base.FireMissiles();
}
基本クラスのコンストラクターと基本クラスのメソッドを呼び出すための構文は、表示できるように異なります。
他のヒント
リストした構文は、このコンストラクターがパラメーターを使用してスーパークラスのコンストラクターを呼び出すことを意味します splashForm
このオブジェクトの構造の残りの部分を続行する前。スーパークラスコンストラクターがリストされていない場合、ARGノーアルグコンストラクターが想定されます。
public SplashAppContext(Form mainForm, Form splashForm)
{ ... }
に相当します
public SplashAppContext(Form mainForm, Form splashForm) : base()
{ ... }
これは何ですか...
この行はaと呼ばれます コンストラクターイニシャルイザー. 。それは「パラメーターを使用してベースクラスのコンストラクターを呼び出すことを意味します splashForm
, 、このコンストラクターの体を開始します」。
コンストラクターの初期化がコンストラクターに明示的に指定されていない場合、あなたが望むと想定されています base()
, 、パラメーターレスコンストラクター。
...これは通常の方法で可能ですか?
通常の方法については、もちろんベースクラスのメソッドを呼び出すことができます( base.SomeMethod(...)
)、しかし、「初期化」スタイルはありません。
: base(splashForm)
親コンストラクターを呼び出して通過しています splashForm
それに。
これは実際には継承の場合ではありません。この構文が指定しているのは、SplashAppContextのコンストラクターが呼び出される前に、そのベースコンストラクターをパラメーターとして渡されてsplashformで呼び出す必要があることです。
これは、直接の親クラスのコンストラクターを呼び出すための構文です。これはC#構文ですが、VB.NETはあなたが呼び出すことを要求します MyBase.New(splashForm)
コンストラクターのコードの最初の行として。
これは、子オブジェクトが完全に構築され、子供のコンストラクタコードが実行され始めるまでに初期化されることが保証されているため、この方法で表現されます。このため、両方のコンパイラ(VB.NETとC#)は、親コンストラクターが呼び出される前に独自のコードを実行できないことを指定します(親コンストラクターを指定しない場合、パラメーターのないコンストラクターが存在する場合、呼び出されます自動的)。
この構文は、他のメソッド呼び出しには不可能です(必要もありません)。 base.FunctionName()
あなたのコードで。コンストラクターは、他のコードの前に実行する必要があるため、特別なケースにすぎません。