프로그래밍/조각코드
[C#] 위임과 상속 연습코드~
ngcbbs
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();
}
}
}
}