반응형

//델리게이트 & 이벤트
//메서드의 대리자
//메서드를 보다 효율적으로 사용하기 위하여 특정 메서드 자체를 캡슐화 할수 있게 만들어 주는 방법
//델리게이트를 사용하려면 어떤 메서드를 호출할 것인지 컴파일할 시점이 아닌 프로그램을 실행하는 런타임 상황에서 결정할 수 있다.

//1단계 - Delegate할 메서드 정의
using System;
class Atype
{
 public void F1() //Delegate 할 Method1
 {
  Console.WriteLine("Atype.F1");
 }
 public void F2(int x) //Delegate 할 Method2
 {
  Console.WriteLine("Atype.F2 =x"+x);
 }
}

//2단계 - Method에 맞는 Delegate 선언
using System;
delegate void SimpleDelegate1(); // Delegate 선언1 --> void F1()
delegate void SimpleDelegate2(); // Delegate 선언2 --> void F2()
class Atype
{
 public void F1() //Delegate 할 Method1
 {
  Console.WriteLine("Atype.F1");
 }
 public void F2(int x) //Delegate 할 Method2
 {
  Console.WriteLine("Atype.F2 =x"+x);
 }
}

//3단계 - 임의의 객체 생성
//Delegate할 Method를 정하고 Delegate를 선언했다면, 이제 Method가 포함된 Class의 객체를 만들어야 한다. 그래야 특정 객체의 메서드가 하나의 독립적인 Delegate로서 활동 할수 있다.
using System;
delegate void SimpleDelegate1(); // Delegate 선언1 --> void F1()
delegate void SimpleDelegate2(int i); // Delegate 선언2 --> void F2()
class Atype
{
 public void F1() //Delegate 할 Method1
 {
  Console.WriteLine("Atype.F1");
 }
 public void F2(int x) //Delegate 할 Method2
 {
  Console.WriteLine("Atype.F2 =x"+x);
 }
}
class DeleTest
{
 public static void Main()
 {
  Atype atype = new Atype(); // 객체(Instance) 생성
 }
}

//4단계 - Delegate 생성과 호출
using System;
delegate void SimpleDelegate1(); // Delegate 선언1 --> void F1()
delegate void SimpleDelegate2(int i); // Delegate 선언2 --> void F2()
class Atype
{
 public void F1() //Delegate 할 Method1
 {
  Console.WriteLine("Atype.F1");
 }
 public void F2(int x) //Delegate 할 Method2
 {
  Console.WriteLine("Atype.F2 =x"+x);
 }
}
class DeleTest
{
 public static void Main()
 {
  Atype atype = new Atype(); // 객체(Instance) 생성
  SimpleDelegate1 s1 = new SimpleDelegate1(atype.F1); //Delegate 생성
  SimpleDelegate2 s2 = new SimpleDelegate2(atype.F2); //Delegate 생성
  
  s1(); //Delegate를 이용한 호출1
  s2(1000); // Delegate를 이용한 호출2
 }
}

 

 


//메소드 호출 : 일반 메소드 & 인스턴스 메소드
using System;

namespace delegateEX
{
 public delegate void MyDelegate(int x); //델리게이트 선언

 class MyClass
 {
  public static void Test(int x)
  {
   Console.WriteLine("Test 메서드의 x 값은 : {0}",x);
  }
  public static void Test2(int x)
  {
   Console.WriteLine("Test2 메서드의 x 값은 : {0}",x);
  }

  class Class1
  {
   [STAThread]
   static void Main(string[] args)
   {
    MyClass.Test(100);  //일반 메소드 호출 형식

    //Test델리게이트 Instance 생성
    MyDelegate MD = new MyDelegate(MyClass.Test);
    MD(100); // 델리게이트를 통한 호출

    MD = new MyDelegate(MyClass.Test2);
    MD(200);
   }
  }
 }
}

 

 

//하나의 Delegate에 여러개의 Delegate등록

using System;
delegate void TopDelegator(string str); //Delegate Declare

class Top
{
 public static void StaticMethod(string str)
 {
  Console.WriteLine("static Method \t");
  Console.WriteLine(str);
 }
 public void NormalMethod(string str)
 {
  Console.WriteLine("Normal Method \t");
  Console.WriteLine(str);
 }
}
class MultiDelegateTest
{
 public static void Main()
 {
  Top t = new Top(); //클래스 인스턴스화
  TopDelegator bank;
  TopDelegator td1 = new TopDelegator(t.NormalMethod); // 델리게이트 인스턴스화
  TopDelegator td2 = new TopDelegator(Top.StaticMethod); // 델리게이트 인스턴스화

  bank = td1;
        bank("add TopDelegator 1"); // 하나의 delegate 호출
  
  
bank += td2;
  bank("add TopDelegator 2"); // 두개의 delegate 호출

  
 
 bank -= td1;
  bank("remove topDelegator 1"); // Delegate 제거
 }
}

 

 

using System;

namespace DelegateEX
{
 public delegate void MyDelegate(string message);//Delegate 선언

 class MyClass
 {
  public string message; //string 변수선언

  public void Process(MyDelegate mydelegate) // 공용 메소드 선언
  {
   mydelegate(message);//선언한 string 변수 삽입
  }
 }

 class Class1
 {
  public static void DisplayMessage1(string message)
  {
   Console.WriteLine("DisplayMessage1 : {0}", message);
  }
  public void DisplayMessage2(string message)
  {
   Console.WriteLine("DisplayMessage2 : {0}",message);
  }

  [STAThread]
  static void Main(string[] args)
  {
   MyClass mc = new MyClass(); // 초기화

 

   mc.message ="cookee";
   MyDelegate md1 = new MyDelegate(DisplayMessage1); 

   mc.Process(md1);

 

   mc.message = "cookee2";
   MyDelegate md2 = new MyDelegate(new Class1().DisplayMessage2);
   mc.Process(md2);

  }
 }
}


 

using System;

namespace DelegateEX
{
 public delegate int MyDelegate(int i, string s);//반환값이 Int, string 매개변수가 두개인 델리게이트 선언.

 class Class1
 {
  public MyDelegate my; //MyDelegate형 my 선언.

  public int Hello(int i,string s) // my가 호출되었을때 실행할 메소드 작성
  {
   Console.WriteLine("Hello MyDelegate my -- {0}",s);
   return i;
  }

  [STAThread]
  static void Main(string[] args)
  {
   Class1 cs = new Class1();//초기화..

   cs.my = new MyDelegate(cs.Hello);//my변수에 처리할 메소드 Hello 할당.
   int i = cs.my(2,"cookee"); // 델리게이트형 변수 my 실행.
   Console.WriteLine(i);
  }
 }
}

using System;

namespace DelegateEX
{
 public delegate void MyDelegate();//void 이고 인자가 없는 delegate 선언.

 class Class1 //서로다른 클래스 : Class1
 {
  public event MyDelegate my; //MyDelegate형 my 선언(my는 이벤트 변수가 된다.) event 키워드 붙인다.

  public void Hello() // my가 실행할 메소드 작성
  {
   Console.WriteLine("다른 클래스에서 인자없고 반환없는 델리게이트 실행한 결과");
  }

  public void TriggerEvent() //이벤트 받는 메소드
  {
   this.my(); //이벤트 메소드 내에서 Event my()실행.
  }
 }

 class execute  //서로다른 메인클래스
 {
  [STAThread]
  static void Main(string[] args)
  {
   Class1 cs = new Class1();//초기화..

   cs.my += new MyDelegate(cs.Hello);//델리게이트변수 my가 처리할 메소드 Hello를 할당.
   cs.TriggerEvent(); //이벤트를 받을 메소드 부름.
  }
 }
}

  Delegate - 7.Event 와 Delegate

//=========================== 1 =========================================================

using System;

namespace DelegateEX
{
 public delegate void MyEventHandler2(string s); //델리게이트 선언

 class myButton2
 {
  public event MyEventHandler2 Event; // delegate형 이벤트 등록.
  
  public void button2_Click(string val)
  {
   Console.WriteLine("{0} : 버튼에서 이벤트 발생 :",val);
  }
  public void button3_Click(string val)
  {
   Console.WriteLine("{0} : 버튼에서 또 이벤트 발생 :",val);
  }
  static void Main(string[] args)
  {
   myButton2 ok = new myButton2();

   //이벤트 발생
   ok.Event += new MyEventHandler2(ok.button2_Click);

   //이벤트 추가
   ok.Event += new MyEventHandler2(ok.button3_Click);
   ok.Event("cookee");
  }
 }
}

 

Delegate - 8. 윈폼띄우기

using System;
using System.Drawing;//솔루션탐색기에서 참조추가 해준다.
using System.Windows.Forms;//마찬가지로 참조추가 해준다.

namespace DelegateEX
{
 public class EventCall
 {
  public static void Hello(object sender, EventArgs e)
  {
   Console.WriteLine("Hello 메소드 실행!!");
  }

  public static void cookee(object sender, EventArgs e)
  {
   int x = 100, y=100;
   Console.WriteLine("cookee");
   Form frm1 = new Form();

   Button btn2 = new Button();
   btn2.Text = "버튼2";

   x = x + btn2.Location.X;
   y = y + btn2.Location.Y;

   btn2.Location = new Point(x,y);
   frm1.Controls.Add(btn2);
   frm1.Show();

   Console.WriteLine("cookee매소드 실행!!");
  }

  public static void Main(string[] args)
  {
   Form f = new Form();

   Button btn = new Button();

   //버튼 속성 지정
   btn.Text = "버튼을 누르면 Hello 메소드실행! ";
   btn.Location = new Point(100,100); // point 구조체의 생성자에 할당.
   btn.Size = new Size(200,30);//size 구조체의 생성자에 할당.
   btn.ForeColor = Color.Black;
   btn.BackColor = Color.Red;

   f.Controls.Add(btn);
   btn.Click += new EventHandler(Hello);

   Button btn1 = new Button();
   btn1.Text = "버튼위에 마우스커서를 올려놓으면 cookee 메소드실행 ";
   btn1.Size = new Size(180,50);
   btn1.BackColor = Color.Yellow;
   btn.Location = new Point(50,100);
   f.Controls.Add(btn1);
   btn1.MouseHover += new EventHandler(cookee);//버튼위에 올려놓으면 새로운 Form이 뜬다.

   Application.Run(f);
  }
 }  
}


 

 

 [출처] Delegate 의 사용|작성자 니시오카  

 

 

 

 

반응형

+ Recent posts