virtual(C# 참조)
업데이트: 2007년 11월
virtual 키워드는 메서드, 속성, 인덱서 또는 이벤트 선언을 한정하는 데 사용되며 파생 클래스에서 재정의될 수 있습니다. 예를 들어, 다음 메서드는 이 메서드를 상속하는 클래스에 의해 재정의될 수 있습니다.
public virtual double Area()
{
return x * y;
}
가상 멤버의 구현은 파생 클래스의 override 멤버에 의해 변경될 수 있습니다. virtual 키워드를 사용하는 방법에 대한 자세한 내용은 Override 및 New 키워드를 사용하여 버전 관리(C# 프로그래밍 가이드) 및 Override 및 New 키워드를 사용해야 하는 경우(C# 프로그래밍 가이드)를 참조하십시오.
설명
가상 메서드가 호출되면 재정의 함수에 대해 개체의 런타임 형식이 검사됩니다. 가장 많이 파생되는 클래스의 재정의 멤버가 호출되므로 멤버를 재정의한 파생 클래스가 없을 경우에는 원래 멤버가 호출될 수도 있습니다.
기본적으로 메서드는 비 가상 메서드이며 비 가상 메서드는 재정의할 수 없습니다.
virtual 한정자는 static, abstract, private 또는 override 한정자와 함께 사용할 수 없습니다.
가상 속성은 추상 메서드와 비슷하게 작동하지만 선언 및 호출 구문에 차이가 있습니다.
정적 속성에는 virtual 한정자를 사용할 수 없습니다.
상속된 가상 속성은 override 한정자를 사용하는 속성 선언을 포함하는 방법을 통해 파생 클래스에서 재정의될 수 있습니다.
예제
이 예제에서 Dimensions 클래스에는 두 개의 좌표 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 Virtual, override and abstract methods
10.6.3 Virtual methods
10.7.5 Virtual, sealed, override, and abstract accessors