About
Visual C#
統合開発環境ツール:Visual Studio 2008 Professional
データベース:SQL Server 2005 Developer Edition
OS:Windows7 RC

Objective-C
統合開発環境ツール:Xcode3.1.2
OS:Mac OS X v10.5.7 Leopard
  C#   ASP.NET   Link   Contact
         
コンストラクタの定義
 
  無料のExpress Editionはこちらから  
 
 

開発環境

統合開発環境:
Visual Studio 2008 Professional
使用OS:
Windows7 RC

 
 

  コンストラクタとは

コンストラクタとは、インスタンスが生成される際に必ず実行されるメソッドの事で、new演算子が呼ばれたときに実行されます。コンストラクタを実装しない場合は、実行時に自動的に実装されます。そのため、コンストラクタは必ずしも実装する必要はなく、インスタンスの各フィールドに初期値を設定したいときや、生成時に特定のメソッドを実行したいときなどに使用します。

コンストラクタは、以下のように記述することで実装できます。
1
2
3
4
修飾子 クラス名(引数1, 引数2, 引数3...)
{
   //初期化するコードを記述
}

コンストラクタにもアクセス修飾子が指定できます。コンストラクタにアクセス修飾子を指定した場合は通常とは少し違った意味になり、インスタンス化できるアクセスレベルを制限することができます。例えば、コンストラクタのアクセス修飾子を「private」に指定した場合、そのクラスはインスタンス化できなくなります。

コンストラクタには、引数を指定することもできます。new演算子を使用してインスタンス化を行うときに引数を渡せば、コンストラクタに渡され、インスタンス独自のパラメータを設定することも可能です。

なお、コンストラクタの名前は必ずクラス名になります。他の名前を指定すれば、普通のメソッドとして実装されてしまうので注意してください。

  コンストラクタを定義したクラスを作成する

それでは、実際にコンストラクタを定義してプログラムを実行させてみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         RootClass obj = new RootClass();
         obj.show();
         Console.ReadLine();
      }
   }
   class RootClass
   {
      string str;
      public RootClass() //コンストラクタ
      {
         str = "コンストラクタが呼び出されました";
      }
      public virtual void show()
      {
         Console.WriteLine(str);
      }
   }
}

実行結果
1
コンストラクタが呼び出されました

このプログラムでは、20行目でコンストラクタを定義し、12行目でnew演算子を使用して「RootClass」クラスのコンストラクタを呼び出しています。「RootClass」のコンストラクタでは、22行目で変数「str」に文字列を代入して初期化するよう記述しています。

このように、コンストラクタはフィールドの初期値をカスタマイズしたり、コンストラクタの中でメソッドを呼び出せば、インスタンスの生成と同時に特定のメソッドを呼び出すことも可能です。

  コンストラクタに引数を設定する

コンストラクタを定義するときは、引数を設定してフィールドを初期化する使用方法がメインになります。以下のプログラムは、連絡先を管理するクラスにコンストラクタを実装し、インスタンスの生成時にフィールドの初期値を渡すよう実装した例です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         Adress adress1 = new Adress("Europaris","xxx-xxxx-xxxx","europaris@xxx.xx.xx");
         adress1.show();
         Console.ReadLine();
      }
   }
   class Adress
   {
      protected string name; //名前を保持
      protected string tell; //電話番号を保持
      protected string mail; //メールアドレスを保持
      public Adress(string str1, string str2, string str3) //コンストラクタ
      {
         name = str1;
         tell = str2;
         mail = str3;
      }
      public void show()
      {
         Console.WriteLine("------------アドレス情報------------");
         Console.WriteLine(
            String.Format("名前:{0}\n電話番号:{1}\nメールアドレス:{2}"
            , name, tell, mail));
      }
   }
}

実行結果
1
2
3
4
------------アドレス情報------------
名前:Europaris
電話番号:xxx-xxxx-xxxx
メールアドレス:xxx@xxx.xx.xx

22行目のコンストラクタでは、string型の引数を3つ設定し、それぞれの引数を「Adress」クラスのインスタンスが保持する各フィールドに設定するよう記述しています。12行目ではnew演算子を使用して「Adress」クラスをインスタンス化していますが、引数として名前と電話番号、メールアドレスを指定しました。インスタンスの生成時に予め値を保持したい場合、このようにコンストラクタを使用するととても便利です。

  継承関係にあるコンストラクタの呼び出し

継承関係にあるクラスをインスタンス化した場合、親クラス、派生クラス両方のコンストラクタが呼ばれます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         SubClass obj = new SubClass();
         Console.ReadLine();
      }
   }
   class RootClass
   {
      public RootClass() //親クラスのコンストラクタ
      {
         Console.WriteLine("親クラスのコンストラクタが呼ばれました");
      }
   }
   class SubClass : RootClass //派生クラスのコンストラクタ
   {
      public SubClass()
      {
         Console.WriteLine("派生クラスのコンストラクタが呼ばれました");
      }
   }
}

実行結果
1
2
親クラスのコンストラクタが呼ばれました
派生クラスのコンストラクタが呼ばれました

12行目では派生クラスである「SubClass」クラスのインスタンスを作成していますが、このプログラムの実行結果を見てみると、インスタンス化を行う際は継承関係にある親クラス、派生クラス両方のコンストラクタが呼ばれているのがわかります。
   
Search:

Count:
inserted by FC2 system