게임코디 연제 강좌로 올라온 온라인 공개 책(문서)를 보면서 작성한것...

위임과 C/C++ 에서의 상속과 C#의 상속이 어떻게 다른지 살펴볼 수 있는 예제 코드... 공개 책(문서)에는 서로 따로 표시하고 있었는데 그다지 나눠서 보지 않아도 너무 간결한게 좋아 보인다. (사실 전에는 뭐여 이상한 키워드가 마구 생겼잖아 했었지..)


using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Linq;
using System.Text;
using System.IO;

namespace ToolboxTestApp3
{
    class MissileTurret
    {
        public string Name;
        public GameWorld refGameWorld;
        public MissileTurret(GameWorld world)
        {
            refGameWorld = world;
            refGameWorld.dg_object += new GameWorld.dg_FindEnemy(FindEnemy); // 위임(다중)
        }

        public virtual void FindEnemy()
        {
            System.Console.WriteLine("미사일터렛({0}) 적발견!!", Name);
        }

        public virtual void Update()
        {
            System.Console.WriteLine("미사일터렛({0})", Name);
        }
    }

    class JustTurret : MissileTurret
    {
        public JustTurret(GameWorld world)
            : base(world) // C/C++ 에서는 부모 CLASS 의 이름을 써줘야 했지만 base 로 ok.
        {
        }

        public override void FindEnemy()
        {
            System.Console.WriteLine("터렛({0}) 적발견!!", Name);
        }

        public override void Update()
        {
            // 부모의 함수를 호출하고 싶다면 base.Update() 를 호출하면 됨.
            System.Console.WriteLine("터렛({0})", Name);
        }
    }

    class GameWorld
    {
        public ArrayList gameObjects = new ArrayList();

        // 위임 선언
        public delegate void dg_FindEnemy();

        // 위임객체
        public dg_FindEnemy dg_object;

        public void Update()
        {
            int nCount = gameObjects.Count;
            for (int i = 0; i < nCount; ++i)
            {
                ((MissileTurret)gameObjects[i]).Update();
            }

            //////////////////////////////////////////////////////////////////////////
            Random r = new Random();
            int nRet = r.Next(100);
            if (nRet > 50)
            {
                if (dg_object != null)
                {
                    System.Console.WriteLine("Subject 에 연결된 Observer 개수: " + dg_object.GetInvocationList().Length);
                    dg_object();
                }
            }
            else
            {
                System.Console.WriteLine("랜덤숫자~: " + nRet);
            }
        }
    }

    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            GameWorld world = new GameWorld();

            MissileTurret turret1 = new MissileTurret(world);
            turret1.Name = "터렛1";

            JustTurret turret2 = new JustTurret(world);
            turret2.Name = "터렛2";

            MissileTurret turret3 = new MissileTurret(world);
            turret3.Name = "터렛3";

            world.gameObjects.Add(turret1);
            world.gameObjects.Add(turret2);
            world.gameObjects.Add(turret3);

            bool bLoop = true;
            while (bLoop)
            {
                Thread.Sleep(1000);
                System.Console.WriteLine("게임시작~");
                world.Update();
            }
        }
    }
}


Posted by ngcbbs
,