C#のコンストラクタでオーバーロード

コンストラクタとは、インスタンスが生成された時に自動的に最初に呼び出されるメソッドです。

つまり、クラスが new された時に実行されるメソッドです。

クラスが変数を持っている場合など、このコンストラクタを使って変数の初期化を行う事ができます。


コンストラクタの基本

シンプルなコンストラクタ

以下はコンストラクタの簡単な例です。

    public class Test
    {
        public string Tag;

        public Test()
        {
            Tag = "A";
        }
    }

5行目~8行目がコンストラクタです。

コンストラクタは戻り値を定義しません。

さらに、メソッド名はクラス名と同じである必要があります。

    static void Main(string[] args)
    {
        Test test = new Test();
    }

このようにクラスが new された時点でコンストラクタが呼び出され test.Tag には ”A" という値がセットされます。

引数を持ったコンストラクタ

コンストラクタには引数を持たせる事も可能です。

    public class Test
    {
        public string Tag;

        public Test(string tag)
        {
            Tag = tag;
        }
    }

このようにコンストラクタに引数があるクラスのインスタンスを作成する場合は、new する時に引数を渡して作成します。

    static void Main(string[] args)
    {
        Test test = new Test("A");
    }

コンストラクタをオーバーロード

オーバーロードとは、同じメソッド名で引数の型や数が異なる複数のメソッドを定義する事です。

(オーバーライドではありません。オーバーライドは親クラスのメソッドを定義し直す事。)

 

オーバーロードはコンストラクタでも同じように定義出来ます。

以下のように、引数の異なる複数のコンストラクタを作ることが出来ます。

    public class Test
    {
        public string Tag;


        public Test()
        {
            Tag = "A";
        }

        public Test(string tag)
        {
            Tag = tag;
        }
    }

どちらのコンストラクタが使われるかは、new する時の引数で変わります。

    static void Main(string[] args)
    {
        Test testA = new Test();        // 引数無しのコンストラクタが呼ばれTagには"A"が入る
        Test testB = new Test("B");     // 引数有りのコンストラクタが呼ばれTagには"B"が入る
    }

コンストラクタからコンストラクタを呼ぶ

オーバーロードを使う事でコンストラクタを複数定義する事が出来ます。

ただ、やる内容はほどんど同じになるわけで、初期化が必要な変数が多くなると同じコードを複数書くのは面倒です。

こんな時はコンストラクタからオーバーロードした別のコンストラクタを呼んでしまう方が楽だしタイプミスも無くせます。

    public class Test
    {
        public string Tag;


        public Test() : this("A")
        {
        }

        public Test(string tag)
        {
            Tag = tag;
        }
    }

メソッド名の記述の後に「 : this("A")」と記述しています。

これは Test() が呼び出された時にまず Test(string tag) が実行される事を示しています。

this で記述した引数に合致するコンストラクタがまず実行されて、その後に Test(){} の中が実行されていきます。

 

関連記事