C# では、
Class(Type param1, Type param2) : base(param1)
クラスのコンストラクターが最初に実行され、次にスーパークラスのコンストラクターが呼び出されますか、それとも基本コンストラクターが最初に呼び出されますか?
C# では、
Class(Type param1, Type param2) : base(param1)
クラスのコンストラクターが最初に実行され、次にスーパークラスのコンストラクターが呼び出されますか、それとも基本コンストラクターが最初に呼び出されますか?
順序は次のとおりです。
次に、最も派生したクラスから始めます。
Foo() : this(...)
このクラスのチェーン内のコンストラクター本体が実行されます ( etcでチェーンされている場合、複数存在する可能性があることに注意してください)Java では、変数初期化子が実行される前に基底クラスが初期化されることに注意してください。コードを移植したことがある場合、これは知っておくべき重要な違いです:)
興味のある方は詳細ページをご用意しております。
最初に基本コンストラクターを呼び出します。また:base(param1)
、コンストラクターの後に を置かないと、ベースの空のコンストラクターが呼び出されることに注意してください。
ベースクラスのコンストラクターが最初に呼び出されます。
[編集: 答えるのにかかった時間の中で、質問は完全に変わっていました].
答えは、最初にベースを呼び出すことです。
[以下の古い質問に対する元の回答]
コンストラクター呼び出しの「ベース」ビットをいつ実行するかを尋ねていますか?
その場合、クラスがこのコンストラクターを持つ別のクラスから派生している場合は、コンストラクター ベースへの呼び出しを「チェーン」します。
public class CollisionBase
{
public CollisionBase(Body body, GameObject entity)
{
}
}
public class TerrainCollision : CollisionBase
{
public TerrainCollision(Body body, GameObject entity)
: base(body, entity)
{
}
}
この例では、TerrainCollision
から派生しCollisionBase
ます。この方法でコンストラクターを連鎖させることにより、指定されたコンストラクターが、既定のコンストラクターではなく、指定されたパラメーターを使用して基底クラスで呼び出されることが保証されます (ベースにコンストラクターがある場合)。
コンストラクター メカニズムは、アプリケーションがコンストラクター チェーンを使用できるようにするため、はるかに優れています。アプリケーションを拡張する場合は、継承によって最小限のコード変更を行うことができます。 ジョン・スキーツ 記事
あなたの質問は少し不明確ですが、次の質問をするつもりだったと思います
XNA オブジェクトのベース コンストラクターを呼び出す場合と暗黙のデフォルト コンストラクターを使用する場合
これに対する答えは、シナリオと基になるオブジェクトの両方に大きく依存します。次のことを少し明確にしていただけますか
TerrainCollision
ですか?私の最良の答えは、基本クラスのコンストラクターのパラメーターと一致するパラメーターがある場合は、ほぼ確実にそれを呼び出す必要があるということです。