본문 바로가기
프로그래밍/C#.net

virtual method

by 건우아빠유리남편 2009. 8. 24.
반응형

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


반응형

'프로그래밍 > C#.net' 카테고리의 다른 글

Interface  (0) 2009.08.24
추상화  (0) 2009.08.24
계승  (0) 2009.08.24
정적변수,정적메소드  (0) 2009.08.24
프로퍼티  (0) 2009.08.24

댓글