インスタンス コンストラクタ (C# プログラミング ガイド)
更新 : 2007 年 11 月
インスタンス コンストラクタは、インスタンスを作成および初期化するために使用します。次の例に示すように新しいオブジェクトを作成すると、クラス コンストラクタが呼び出されます。
class CoOrds
{
public int x, y;
// constructor
public CoOrds()
{
x = 0;
y = 0;
}
}
メモ : |
---|
このクラスには、パブリック データ メンバが含まれていますが、これはわかりやすくするためであり、推奨されるプログラミング手法ではありません。この場合、プログラム内のすべてのメソッドに、オブジェクトの内部処理への無制限で検証されないアクセスが許可されるからです。通常、データ メンバはプライベートにし、クラス メソッドとプロパティのみを介してアクセスする必要があります。 |
このコンストラクタは、CoOrds クラスからオブジェクトを作成するときに呼び出されます。引数を取らないこのようなコンストラクタを既定のコンストラクタと呼びます。これは、コンストラクタを追加する場合に便利です。たとえば、CoOrds クラスに、データ メンバの初期値を指定できるコンストラクタを追加できます。
// A constructor with two arguments:
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}
これにより、次のように、既定値や特定の初期値を使って CoOrd オブジェクトを作成できます。
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);
クラスに既定のコンストラクタが存在しない場合は、コンストラクタが自動的に生成され、既定値を使ってオブジェクト フィールドが初期化されます (たとえば、int は 0 (ゼロ) に初期化されます)。既定値の詳細については、「既定値の一覧表 (C# リファレンス)」を参照してください。したがって、CoOrds クラスの既定のコンストラクタはすべてのデータ メンバをゼロに初期化するので、クラスの機能を変更せずに完全に削除できます。下の「例 1」は複数のコンストラクタを使用する完全な例で、「例 2」は自動的に生成されるコンストラクタの例を示しています。
また、インスタンス コンストラクタを使用すると、基本クラスのインスタンス コンストラクタを呼び出すこともできます。クラス コンストラクタは、初期化子を通じて基本クラスのコンストラクタを呼び出すことができます。次にその例を示します。
class Circle : Shape
{
public Circle(double radius)
: base(radius, 0)
{
}
}
この例の Circle クラスは、Circle の派生元の Shape によって提供されるコンストラクタに、半径と高さを表す値を渡します。下の「例 3」は、Shape と Circle を使用する完全な例を示しています。
例 1
次の例は、クラス コンストラクタを 2 つ使用するクラスを示しています。1 つのコンストラクタには引数がなく、もう 1 つのコンストラクタには引数が 2 つあります。
class CoOrds
{
public int x, y;
// Default constructor:
public CoOrds()
{
x = 0;
y = 0;
}
// A constructor with two arguments:
public CoOrds(int x, int y)
{
this.x = x;
this.y = y;
}
// Override the ToString method:
public override string ToString()
{
return (String.Format("({0},{1})", x, y));
}
}
class MainClass
{
static void Main()
{
CoOrds p1 = new CoOrds();
CoOrds p2 = new CoOrds(5, 3);
// Display the results using the overriden ToString method:
Console.WriteLine("CoOrds #1 at {0}", p1);
Console.WriteLine("CoOrds #2 at {0}", p2);
Console.ReadKey();
}
}
/* Output:
CoOrds #1 at (0,0)
CoOrds #2 at (5,3)
*/
例 2
次の例の Person クラスにはコンストラクタがありません。この場合は、既定のコンストラクタが自動的に使用され、フィールドは既定値に初期化されます。
public class Person
{
public int age;
public string name;
}
class TestPerson
{
static void Main()
{
Person person = new Person();
Console.WriteLine("Name: {0}, Age: {1}", person.name, person.age);
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
// Output: Name: , Age: 0
age の既定値は 0、name の既定値は null です。既定値の詳細については、「既定値の一覧表 (C# リファレンス)」を参照してください。
例 3
次の例は、基本クラスの初期化子の使い方を示しています。Circle クラスは一般的なクラス Shape から派生しており、Cylinder クラスは Circle クラスから派生しています。どちらの派生クラスのコンストラクタも、基本クラスの初期化子を使用しています。
abstract class Shape
{
public const double pi = Math.PI;
protected double x, y;
public Shape(double x, double y)
{
this.x = x;
this.y = y;
}
public abstract double Area();
}
class Circle : Shape
{
public Circle(double radius)
: base(radius, 0)
{
}
public override double Area()
{
return pi * x * x;
}
}
class Cylinder : Circle
{
public Cylinder(double radius, double height)
: base(radius)
{
y = height;
}
public override double Area()
{
return (2 * base.Area()) + (2 * pi * x * y);
}
}
class TestShapes
{
static void Main()
{
double radius = 2.5;
double height = 3.0;
Circle ring = new Circle(radius);
Cylinder tube = new Cylinder(radius, height);
Console.WriteLine("Area of the circle = {0:F2}", ring.Area());
Console.WriteLine("Area of the cylinder = {0:F2}", tube.Area());
// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Area of the circle = 19.63
Area of the cylinder = 86.39
*/
基本クラスのコンストラクタを呼び出すその他の例については、「virtual (C# リファレンス)」、「override (C# リファレンス)」、および「base (C# リファレンス)」を参照してください。