virtual(C# 참조)
virtual 키워드는 메서드, 속성, 인덱서 또는 이벤트 선언을 한정하는 데 사용되며 파생 클래스에서 재정의될 수 있습니다. 예를 들어, 다음 메서드는 이 메서드를 상속하는 클래스에 의해 재정의될 수 있습니다.
public virtual double Area()
{
return x * y;
}
가상 멤버의 구현은 파생 클래스의 override 멤버에 의해 변경될 수 있습니다. virtual 키워드를 사용하는 방법에 대한 자세한 내용은 Override 및 New 키워드를 사용하여 버전 관리(C# 프로그래밍 가이드) 및 Override 및 New 키워드를 사용해야 하는 경우(C# 프로그래밍 가이드)를 참조하십시오.
설명
가상 메서드가 호출되면 재정의 함수에 대해 개체의 런타임 형식이 검사됩니다. 가장 많이 파생되는 클래스의 재정의 멤버가 호출되므로 멤버를 재정의한 파생 클래스가 없을 경우에는 원래 멤버가 호출될 수도 있습니다.
기본적으로 메서드는 비 가상 메서드이며 비 가상 메서드는 재정의할 수 없습니다.
virtual 한정자는 static, abstract, private 또는 override 한정자와 함께 사용할 수 없습니다. 다음 예제에서는 가상 속성을 보여 줍니다.
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 (value != String.Empty)
{
name = value;
}
else
{
name = "Unknown";
}
}
}
}
가상 속성은 추상 메서드와 비슷하게 작동하지만 선언 및 호출 구문에 차이가 있습니다.
정적 속성에는 virtual 한정자를 사용할 수 없습니다.
상속된 가상 속성은 override 한정자를 사용하는 속성 선언을 포함하는 방법을 통해 파생 클래스에서 재정의될 수 있습니다.
예제
이 예제에서 Shape 클래스에는 두 개의 좌표 x 및 y와 Area() 가상 메서드가 포함되어 있습니다. 또한 Circle, Cylinder 및 Sphere 등의 서로 다른 형상 클래스가 Shape 클래스를 상속하며 각 도형에 대한 표면적이 계산됩니다. 각 파생 클래스는 Area()에 대한 자체적인 재정의 구현을 포함합니다.
새 열 상속 된 클래스 Circle, Sphere, 및 Cylinder 모든 다음 선언에서와 같이 기본 클래스를 초기화 하는 생성자를 사용 합니다.
public Cylinder(double r, double h): base(r, h) {}
다음 프로그램을 계산 하 고 적절 한 구현을 호출 하 여 각 그림에 대 한 적절 한 영역을 표시를 Area() 메서드와 연결 된 개체에 따라 방법을.
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# 언어 사양을 참조하세요. C# 언어 사양은 C# 구문 및 사용법에 대한 신뢰할 수 있는 소스입니다.