본문 바로가기
C#

C# 함수에 virtual ( 함수 재 정의 )사용 예제입니다.

by 샤나엘 2020. 10. 26.
반응형

상속관계에서 부모에 정의한 함수를 자식에서 다시 정의해서 사용하는 예제입니다.

 

부모 클래스의 함수에 virtual로 설정해두면, 자식 함수에서는 override 키워드를 사용해서 함수를 재 정의 해서 사용할 수 있습니다.

 

 

 

아래와 같이 Pet Class에는 Bark() 함수와 PlayWith() 함수를 정의해 두고,

Dog Class와 Cat Class는 Pet Class를 상속받아 정의됩니다.

 

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Pet a = new Cat();
            Pet b = new Dog();

            Console.WriteLine(a.GetType().Name);
            Console.WriteLine(a.Intinacy);
            a.PlayWith();
            Console.WriteLine(a.Intinacy);
            a.Bark();

            Console.WriteLine();

            Console.WriteLine(b.GetType().Name);
            Console.WriteLine(b.Intinacy);
            b.PlayWith();
            Console.WriteLine(b.Intinacy);
            b.Bark();
        }
    }

    class Pet
    {
        public double Intinacy { get; set; }

        public Pet()
        {
            this.Intinacy = 1.0;
        }
        public void Bark()
        {
            Console.WriteLine("bow");
        }

        public void PlayWith()
        {
            Intinacy += 0.1;
        }
    }

    class Dog : Pet
    {
        public Dog()
        {
            this.Intinacy = 2.0;
        }
    }

    class Cat : Pet
    {
        public Cat()
        {
            this.Intinacy = 3.0;
        }
    }
}

 

위 처럼 정의 한 후 실행해 보면 Cat이든 Dog 이든 bow로 울게되죠.

 

Cat는 meow로 나타내고 싶은데, 어떻게 하면 될까요~?

 

Pet Class에 정의한 Bark() 함수를 virtual로 설정한 후, 자식 클래스에서 해당 함수를 재 정의 해서 사용할 수 있도록 해주면 됩니다.

 

        public void Bark()
        {
            Console.WriteLine("bow");
        }

 

 

        public virtual void Bark()
        {
            Console.WriteLine("bow");
        }

 

위 함수를 아래와 같이 변경해주고, Cat Class에서는 Bark() 함수를 오버라이드 해서 재 정의 해 주면 됩니다.

 

        public override void Bark()
        {
            Console.WriteLine("meow");
        }

 

====================================================

 

수정된 전체 소스는 아래와 같습니다.

 

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Pet a = new Cat();
            Pet b = new Dog();

            Console.WriteLine(a.GetType().Name);
            Console.WriteLine(a.Intinacy);
            a.PlayWith();
            Console.WriteLine(a.Intinacy);
            a.Bark();

            Console.WriteLine();

            Console.WriteLine(b.GetType().Name);
            Console.WriteLine(b.Intinacy);
            b.PlayWith();
            Console.WriteLine(b.Intinacy);
            b.Bark();
        }
    }

    class Pet
    {
        public double Intinacy { get; set; }

        public Pet()
        {
            this.Intinacy = 1.0;
        }
        public virtual void Bark()
        {
            Console.WriteLine("bow");
        }

        public void PlayWith()
        {
            Intinacy += 0.1;
        }
    }

    class Dog : Pet
    {
        public Dog()
        {
            this.Intinacy = 2.0;
        }
    }

    class Cat : Pet
    {
        public Cat()
        {
            this.Intinacy = 3.0;
        }

        public override void Bark()
        {
            Console.WriteLine("meow");
        }
    }
}

 

 

 

실행 결과도 Cat는 meow로 나타나는 걸 확인할 수 있습니다.

 

도움이 되셨으면 좋겠습니다.

 

감사합니다.

 

 

반응형

댓글