virtual (C# リファレンス)virtual (C# Reference)

virtual キーワードは、メソッド、プロパティ、インデクサー、またはイベント宣言を変更し、それを派生クラスでオーバーライドできるようにするために使用されます。The virtual keyword is used to modify a method, property, indexer, or event declaration and allow for it to be overridden in a derived class. たとえば、次のメソッドはそれを継承する任意のクラスでオーバーライドできます。For example, this method can be overridden by any class that inherits it:

public virtual double Area() 
{
    return x * y;
}

仮想メンバーの実装は、派生クラスのオーバーライド メンバーによって変更できます。The implementation of a virtual member can be changed by an overriding member in a derived class. virtual キーワードの使い方について詳しくは、「Override キーワードと New キーワードによるバージョン管理」および「Override キーワードと New キーワードを使用する場合について」をご覧ください。For more information about how to use the virtual keyword, see Versioning with the Override and New Keywords and Knowing When to Use Override and New Keywords.

解説Remarks

仮想メソッドが呼び出されると、オブジェクトの実行時の型が、オーバーライドするメンバーに対してチェックされます。When a virtual method is invoked, the run-time type of the object is checked for an overriding member. いずれの派生クラスもメンバーをオーバーライドしなかった場合は、最派生クラスのオーバーライド メンバー (元のメンバーである可能性があります) が呼び出されます。The overriding member in the most derived class is called, which might be the original member, if no derived class has overridden the member.

既定では、メソッドは仮想ではありません。By default, methods are non-virtual. 非仮想メソッドをオーバーライドすることはできません。You cannot override a non-virtual method.

virtual 修飾子を、staticabstractprivateoverride 修飾子と共に使用することはできません。You cannot use the virtual modifier with the static, abstract, private, or override modifiers. 次のコードは、仮想のプロパティの例です。The following example shows a virtual property:

class MyBaseClass
{
    // virtual auto-implemented property. Overrides can only
    // provide specialized behavior if they implement get and set accessors.
    public virtual string Name { get; set; }

    // ordinary virtual property with backing field
    private int num;
    public virtual int Number
    {
        get { return num; }
        set { num = value; }
    }
}

class MyDerivedClass : MyBaseClass
{
    private string name;

   // Override auto-implemented property with ordinary property
   // to provide specialized accessor behavior.
    public override string Name
    {
        get
        {
            return name;
        }
        set
        {
            if (!string.IsNullOrEmpty(value))
            {
                name = value;
            }
            else
            {
                name = "Unknown";
            }
        }
    } 
}

仮想プロパティは、宣言と呼び出しの構文の違いを除けば、抽象メソッドと似た働きを持ちます。Virtual properties behave like abstract methods, except for the differences in declaration and invocation syntax.

  • virtual 修飾子を静的プロパティに対して使うのは誤りです。It is an error to use the virtual modifier on a static property.

  • 継承する仮想プロパティは、派生クラス内で override 修飾子を使ったプロパティ宣言を記述することでオーバーライドすることができます。A virtual inherited property can be overridden in a derived class by including a property declaration that uses the override modifier.

Example

この例では、Shape クラスに 2 つの座標 (xy) と仮想メソッド Area() が含まれています。In this example, the Shape class contains the two coordinates x, y, and the Area() virtual method. 他の図形クラス (CircleCylinderSphere など) は Shape クラスを継承しており、各図の表面積が計算されています。Different shape classes such as Circle, Cylinder, and Sphere inherit the Shape class, and the surface area is calculated for each figure. 各派生クラスは、Area() のオーバーライド実装を独自に持っています。Each derived class has its own override implementation of Area().

次の宣言に示すように、継承されたクラス (CircleSphere、および Cylinder) はいずれも、基底クラスを初期化するコンス トラクターを使用します。Notice that the inherited classes Circle, Sphere, and Cylinder all use constructors that initialize the base class, as shown in the following declaration.

public Cylinder(double r, double h): base(r, h) {}

次のプログラムは、メソッドに関連付けられたオブジェクトに従って Area() メソッドの適切な実装を呼び出すことにより、各図形の面積を計算し、表示します。The following program calculates and displays the appropriate area for each figure by invoking the appropriate implementation of the Area() method, according to the object that is associated with the method.

class TestClass
{
    public class Shape
    {
        public const double PI = Math.PI;
        protected double x, y;
        
        public Shape()
        {
        }
        
        public Shape(double x, double y)
        {
            this.x = x;
            this.y = y;
        }

        public virtual double Area()
        {
            return x * y;
        }
    }

    public class Circle : Shape
    {
        public Circle(double r) : base(r, 0)
        {
        }

        public override double Area()
        {
            return PI * x * x;
        }
    }

    class Sphere : Shape
    {
        public Sphere(double r) : base(r, 0)
        {
        }

        public override double Area()
        {
            return 4 * PI * x * x;
        }
    }

    class Cylinder : Shape
    {
        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;
        Shape c = new Circle(r);
        Shape s = new Sphere(r);
        Shape 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# language specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

関連項目See also