コンストラクタとは、インスタンスが生成された時に自動的に最初に呼び出されるメソッドです。
つまり、クラスが new された時に実行されるメソッドです。
生成するクラスが継承されたクラスだった場合、親クラスと子クラスのコンストラクタはそれぞれどのように実行されていくのでしょうか?確認してみたいと思います。
コンストラクタの基本とオーバーロード
まずはコンストラクタとオーバーロードについて理解しておく必要があります。
コンストラクタとオーバーロードについては「C#のコンストラクタでオーバーロード」を参照してください。
通常は親クラスのコンストラクタがまず呼ばれる
なにも意識せずに継承クラスを作成した場合、クラスのインスタンスを生成すると、まず親クラスのコンストラクタが呼び出され、その後子クラスのコンストラクタが呼び出されるという動作になります。
以下の例では、TestAクラスを継承したTestBクラスがあり、さらにTestBクラスを継承したTestCクラスがあります。
public class TestA { public TestA() { Console.Write("TestA()\n"); } } public class TestB : TestA { public TestB() { Console.Write("TestB()\n"); } } public class TestC : TestB { public TestC() { Console.Write("TestC()\n"); } }
このTestCクラスのインスタンスを作成すると、
static void Main(string[] args) { TestC testC = new TestC(); }
結果は以下のような出力になります。
TestA() TestB() TestC()
親→子→孫の順にコンストラクタが実行されていることが分かります。
明示的に親クラスのコンストラクタを呼ぶ
親クラスのコンストラクタが引数を持っている場合は、引数を持ったコンストラクタを呼び出す事を明示する必要があります。
public class TestA { public TestA() { Console.Write("TestA()\n"); } } public class TestB : TestA { public TestB() { Console.Write("TestB()\n"); } public TestB(int a) { Console.Write("TestB(int a)\n"); } } public class TestC : TestB { public TestC() { Console.Write("TestC()\n"); } public TestC(int a) : base(a) { Console.Write("TestC(int a)\n"); } }
29行目ではメソッド名の記述の後に「 : base(a)」と記述しています。
これは int型 の引数を一つ持つ親クラスのコンストラクタを実行する事を示しています。
※通常は「 : base()」が省略されていると考える事ができます。
このTestCを引数を指定してインスタンスを作成すると、
static void Main(string[] args) { TestC testC = new TestC(0); }
結果は以下のような出力になります。
TestA() TestB(int a) TestC(int a)
関連記事
- C#の値型と参照型の違い
- C#のコンストラクタでオーバーロード
- C#のコンストラクタの継承
- C#のジェネリックを使おう
- C#のデリゲート (delegate) って何?
- C#のデリゲートお手軽にする匿名メソッド
- C#のラムダ式【=>】って何?
- C#で基底クラスのメソッドを置き換えるオーバーライド
- C#でキャストとas演算子を使いこなす
- C#で型を判別するtypeofとis演算子
- C#の値型でもnullを扱えるようにするNullable
- C#のリソース解放にはIDisposableとusingを使おう
- C#のStringとstring、Int32とint 違いは・・・ない!
- C#でasync/awaitを使った非同期処理
- C#で文字列を指定の区切り文字で分割
- C#のstring.Formatで桁数や書式を指定する
- C#の配列やListをソートする
- C#の配列やListを検索する (Find,FindAll,FindIndex)
- C#の配列やListを高速に検索する (BinarySearch)
- C#の配列の中に指定の要素が存在するかを調べる(LINQ Contains)
- C#の配列の中に条件を満たす要素が存在するかを調べる(LINQ Any)
- C#の配列から条件に合う要素を抽出する(LINQ Where)
- C#の配列で要素毎の処理結果を得る(LINQ Select)
- C#の配列を並び替える(LINQ OrderBy,ThenBy)
- C#の配列をグループ毎に処理する(LINQ GroupBy)
- C#の配列を内部結合(INNER JOIN)する(LINQ Join)
- C#の配列から最初の要素を取り出す(LINQ First,FirstOrDefault)
- C#の配列の重複要素を削除する(LINQ Distinct)
- C#でフォルダ内のファイル名一覧を取得する
- C#でテキストファイルを読み込む
- C#でテキストファイルに書き込む
- C#でバイナリファイルを読み込む
- C#でバイナリファイルに書き込む
コメントをお書きください