virtual (C# リファレンス)
更新 : 2007 年 11 月
virtual キーワードは、メソッド、プロパティ、インデクサ、またはイベントの宣言を修飾し、派生クラスでオーバーライドできるようにするために使用します。たとえば、このメソッドは、このメソッドを継承するクラスでオーバーライドできます。
public virtual double Area()
{
return x * y;
}
仮想メンバの実装は、オーバーライドするメンバによって派生クラスで変更できます。virtual キーワードを使用する方法の詳細については、「Override キーワードと New キーワードによるバージョン管理 (C# プログラミング ガイド)」および「Override キーワードと New キーワードを使用する場合について (C# プログラミング ガイド)」を参照してください。
解説
仮想メンバが呼び出されるときには、オブジェクトの実行時の型が、オーバーライドするメンバで確認されます。メンバをオーバーライドしている派生クラスがない場合には、おそらくはオリジナルのメンバである、最派生クラスでオーバーライドするメンバが呼び出されます。
既定では、これらのメソッドは非仮想です。非仮想メソッドのオーバーライドはできません。
virtual 修飾子は、static、abstract, private、または override の各修飾子と一緒には使用できません。
仮想プロパティは抽象メソッドと同様に動作しますが、宣言の構文および呼び出しの構文に相違があります。
静的プロパティで virtual 修飾子を使用するのはエラーです。
継承された仮想プロパティを派生クラス内でオーバーライドできます。オーバーライドするには、override 修飾子を使用しているプロパティ宣言をインクルードします。
使用例
この例では、Dimensions クラスに 2 本の座標軸 x および y と、Area() 仮想メソッドがあります。図形のクラス、たとえば Circle、Cylinder、および Sphere が Dimensions クラスを継承し、各図形について、表面積が計算されます。各派生クラスには、Area() の独自のオーバーライド実装があります。このプログラムは、メソッドと関連付けられているオブジェクトに従って、Area() の適切な実装を呼び出すことによって、各図形の適切な表面積の計算および表示を行います。
継承された Circle、Sphere、および Cylinder のすべてのクラスが、基本クラスを初期化するコンストラクタを使用することに注意してください。たとえば、次のようなコードです。
public Cylinder(double r, double h): base(r, h) {}
これは、C++ の初期化リストに似ています。
class TestClass
{
public class Dimensions
{
public const double PI = Math.PI;
protected double x, y;
public Dimensions()
{
}
public Dimensions(double x, double y)
{
this.x = x;
this.y = y;
}
public virtual double Area()
{
return x * y;
}
}
public class Circle : Dimensions
{
public Circle(double r) : base(r, 0)
{
}
public override double Area()
{
return PI * x * x;
}
}
class Sphere : Dimensions
{
public Sphere(double r) : base(r, 0)
{
}
public override double Area()
{
return 4 * PI * x * x;
}
}
class Cylinder : Dimensions
{
public Cylinder(double r, double h) : base(r, h)
{
}
public override double Area()
{
return 2 * PI * x * x + 2 * PI * x * y;
}
}
static void Main()
{
double r = 3.0, h = 5.0;
Dimensions c = new Circle(r);
Dimensions s = new Sphere(r);
Dimensions l = new Cylinder(r, h);
// Display results:
Console.WriteLine("Area of Circle = {0:F2}", c.Area());
Console.WriteLine("Area of Sphere = {0:F2}", s.Area());
Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());
}
}
/*
Output:
Area of Circle = 28.27
Area of Sphere = 113.10
Area of Cylinder = 150.80
*/
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
1.6.6.4 仮想メソッド、オーバーライド メソッド、抽象メソッド
10.6.3 仮想メソッド
10.7.5 仮想、シール、オーバーライド、抽象の各アクセサ