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

これは、直接の親クラスのコンストラクターを呼び出すための構文です。これはC#構文ですが、VB.NETではMyBase.New(splashForm)、コンストラクターのコードの最初の行として呼び出す必要があります。

これは、子コンストラクターコードの実行が開始されるまでに親オブジェクトが完全に構築および初期化されることが保証されているため、このように表現されます。このため、両方のコンパイラ(VB.NETおよびC#)は、親コンストラクターが呼び出される前に独自のコードを実行できないことを指定しています(親コンストラクターを指定せず、パラメーターなしのコンストラクターが存在する場合は、呼び出されます)自動的)。

base.FunctionName()コードを呼び出すことで他の関数の基本実装を呼び出すことができるため、この構文は他のメソッド呼び出しでは不可能です(必要でもありません) 。コンストラクターは、他のコードの前に実行する必要があるため、単なる特殊なケースです。

于 2010-06-18T18:45:18.593 に答える
1

これは実際には継承の場合ではありません。この構文で指定されているのは、SplashAppContextのコンストラクターを呼び出す前に、パラメーターとして渡されたsplashFormを使用してその基本コンストラクターを呼び出す必要があるということです。

于 2010-06-18T18:42:21.293 に答える