22. [C#,오엔제이닷넷강좌]C# virtual 한정자 virtual, 가상함수,메서드,
C#/ASP.NET/ADO닷넷/닷넷교육/닷넷강좌학원/닷넷공부/닷넷책/닷넷객체지향교육
virtual 키워드는 메서드,
속성, 인덱서 또는 이벤트 선언을 한정하는 데 사용되며 파생 클래스에서 재정의될 수
있다. 아래 메서드는 이 메서드를 상속하는 클래스에 의해 재정의될 수 있다.
public virtual double perimeter()
{
return x * y;
}
가상 메서드가 호출되면 재정의 함수에 대해 개체의 런타임 형식이 검사됩니다.
가장 많이 파생되는 클래스의 재정의 멤버가 호출되므로 멤버를 재정의한 파생 클래스가 없을 경우에는 원래 멤버가 호출될 수도
있다.
virtual 한정자는 static,
abstract, private 또는 override 한정자와 함께 사용할 수 없으며
일반 메소드는 비 가상 메서드이며 재정의할 수 없다. 또한 추상 함수(abstract method)는 virtual 키워드를 사용하지
않지만 자동으로 virtual이 된다.
아래는 가상 속성의 예이다.
가상 속성은 추상 메서드와 비슷하게 작동하지만 선언 및 호출 구문에 차이가 있다.
- 정적 속성에는 virtual
한정자를 사용할 수 없다.
- 상속된 가상 속성은
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";
}
}
}
}
[아래 예제를 실습하자.]
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());
}
}
댓글 없음:
댓글 쓰기