|
일일 결과물 |
조 : 2조 |
조장 : 김윤환 | |
조원 : 박노진, 블라디미르, 신배호, 미스토시 | |
주제 : Delegate_2 | |
작성일 : 20101104 |
작성자 : 김윤환 |
델리게이트의 고급 사용법.
Car 클래스
class Car { //CarDelegate public delegate void CarDelegate(Car c); //연결된 싱크 리스트 ArrayList al = new ArrayList(); bool carisdead; int currspeed; int maxspeed; string name; bool dirty; bool rotatetire; //이벤트 소스를 붙이거나 끊기 public void Advise(IEngineEvents iee) { al.Add(iee); } public void UnAdvise(IEngineEvents iee) { al.Remove(iee); } public Car(string _name, int _maxspeed, int _currspeed, bool _dirty, bool _rotatetire) { name = _name; maxspeed = _maxspeed; currspeed = _currspeed;
dirty = _dirty; rotatetire = _rotatetire; } public string Name { get { return name; } set { name = value; } } public bool Dirty { get { return dirty; } set { dirty = value; } } public bool Rotate { get { return rotatetire; } set { rotatetire = value; } } public void SpeedUp(int delta) { ...이전 콜백 인터페이스 학습때 쓰인 코드라 생략한다. } } } |
여기서 쓰이는 델리게이트는 실제로 매개변수 Car 를 취하고 void를 반환하는 메소드에 대한 함수 포인터를 캡슐화 하는 것이다.
Garage 클래스
class Garage { List<Car> cars = new List<Car>(); public Garage() { cars.Add(new Car("1번차", 100, 0, true, false)); cars.Add(new Car("2번차", 100, 0, true, true)); cars.Add(new Car("3번차", 100, 0, false, true)); cars.Add(new Car("4번차", 100, 0, true, false)); cars.Add(new Car("5번차", 100, 0, false, false)); } public void ProcessCars(Car.CarDelegate proc) { if (proc.Target != null) { Console.WriteLine("?.Target : {0}", proc.Target.ToString()); } else { Console.WriteLine("?.Target 은 정적 메소드 입니다"); } foreach (Car c in cars) { proc(c); } } } |
객체 사용자가 ProcessCars()를 호출하면, 이 요청은 처리할 메소드의 이름이 전달 된다.
인수로 사용할 WashCar()와 RotateTires() 라는 이름의 정적 멤버를 만든다.
WashCar()와 RotateTires() 가 있는 CarApp 클래스다.
class CarApp { public void WashCar(Car c) { if (c.Dirty) { Console.WriteLine("{0} : 새차함",c.Name); } else { Console.WriteLine("{0} : 차는 아직 깨끗함",c.Name); } } public void RotateTires(Car c) { if(c.Rotate) { Console.WriteLine("{0} : 바퀴를 교환", c.Name); } else { Console.WriteLine("{0} : 바퀴를 교환하지 않아도 됨",c.Name); } } } |
위 두 메소드는 델리게이트 형식에 정확하게 일치한다. 함수의 이름을 생성자의 매개변수로 전달하면 이러한 항목들이 System.MulticastDelegate에 포함된 내부 연결 목록에 추가된다.
|