ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#] 위임과 상속 연습코드~
    프로그래밍/조각코드 2012. 5. 3. 18:57

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

    위임과 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();
                }
            }
        }
    }
    


Designed by Tistory.