virtual 수식어를 붙인 메소드를 가상메소드(virtual method)라고 부릅니다.
또한, 가상메소드를 파생글래스에서 재정의하는 것을 오버라이드(override:위에 덮어씌우다)라고 합니다.
C#에서는 base클래스의 멤버은패와 동일하게, 프로그래머가 생각지도 않은곳에서 메소드가 오버라이드되는것을 막기위해서, 메소드를 오버라이드할때는 override수식어를 명시적으로 부쳐야 합니다.
예를 들어,
나이를 취득하는 프로파티 age를 virtual로 해서, 일단 의미없는 값을 돌려줍니다.
class Person
{
protected string name;
protected int age;
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
public string Name{get{return this.name;}}
public virtual int Age{get{return 0;}} // base class에서 특별히 의미없는 값을 돌려준다.
}
다음에 정직한 사람 클래스(Truepenny)를 정의하고, 나이를 그대로 말합니다.
/// <summary>
/// 정직한사람
/// 나이를 속이지 않는다.
/// </summary>
class Truepenny : Person
{
public Truepenny(string name, int age) : base(name, age){}
public override int Age
{
get
{
// 나이를 그대로 말한다.
return this.age;
}
}
}
다음에 거짓말쟁이 클래스를 정의하고, 나이를 먹어가면서 대충 나이를 말합니다.
/// <summary>
/// 거짓말쟁이
/// 나이를 속임(그것도 먹을수록 더 젊게..^^)
/// </summary>
class Liar : Person
{
public Liar(string name, int age) : base(name, age){}
public override int Age
{
get
{
// 나이를 속인다..
if(this.age < 20) return this.age;
if(this.age < 25) return this.age - 1;
if(this.age < 30) return this.age - 2;
if(this.age < 35) return this.age - 3;
if(this.age < 40) return this.age - 4;
return this.age - 5;
}
}
}
위의 클래스들을 이용한 프로그램을 만들어 봅니다.
아래 예는, Person클래스를 인수로 해서, 자기소개를 화면에 표시하는 메소드를 준비해 정직한사람,거짓말쟁이 각각에게 자기소개를 하게 합니다.
using System;
class PolimorphismTest
{
public static void Main()
{
Introduce(new Truepenny ("춘향" , 24)); //정직한 24살 --> 24살그대로
Introduce(new Liar ("향단" , 24)); //거짓말쟁이 24살--> 23살로..^^
}
/// <summary>
/// p 씨의 자기소개
/// </summary>
static void Introduce(Person p)
{
Console.Write("제 이름은 {0} 입니다.\n", p.Name);
Console.Write("나이는 {0}살 입니다.\n\n", p.Age);
}
}
Introduce메소드 안에서는 Person의 Age프로퍼티를 불러내지만, 실제로는 동정인 정보를 기준으로 Truepenny,Liar의 나이 프로퍼티가 불러내 집니다.
참조
http://ufcpp.net/study/csharp/oo_polymorphism.html
[출처] 가상메소드(virtual method)|작성자 롱박
댓글