Wanna be Brilliant Full-Stack Developer
C# WINFORMS Delegate 본문
delegate는 메소드를 먼저 만드는것이 우선이다. 보통은 형을 지정하고 들어가는데
메소드가 먼저 우선이다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _24_DelegatePizzaOrder
{
public partial class Form1 : Form
{
public delegate int delFuncDow_Edge(int i);
public delegate int delFuncTopping(string strOrder, int Ea);
public delegate T delFunc<T>(T i); // 함수 명 뒤에 <일반화 변수명 - 형식 매개 변수> 을 사용 할 경우 일반화 함수를 지정 할수 있음 (인자 값 Type에 신경 쓰지 않는 형태)
public delegate A delTest<A>(A i); // 문자 종류는 상관 없음 일반화 함수를 Delegate에도 적용할 수 있다는 점 (확장개념 일반화 delegate를 delegate의 특징이라고 보기는 어렵지 않을지)
public delegate object delFuncO(object i); // var, object
int _iTotalPrice = 0;
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 주문하기 Button을 Click 했을 때 발생 하는 Event
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOrder_Click(object sender, EventArgs e)
{
delFuncDow_Edge delDow = new delFuncDow_Edge(fDow);
delFuncDow_Edge delEdge = new delFuncDow_Edge(fEdge);
delFuncTopping delTopping = null;
int iDowOrder = 0;
int iEdgeOrder = 0;
// 선택 도우 확인
if (rdoDow1.Checked)
{
iDowOrder = 1;
}
else if (rdoDow2.Checked)
{
iDowOrder = 2;
}
//delDow(iDowOrder);
// 선택 엣지 확인
if (rdoEdge1.Checked)
{
iEdgeOrder = 1;
}
else if (rdoEdge2.Checked)
{
iEdgeOrder = 2;
}
//delEdge(iEdgeOrder);
fCallBackDelegate(iDowOrder, delDow);
fCallBackDelegate(iEdgeOrder, delEdge);
// 토핑 선택 확인
if (cboxTopping1.Checked)
{
//delTopping = new delFuncTopping(fTopping1);
delTopping += fTopping1;
}
if (cboxTopping2.Checked) delTopping += fTopping2;
if (cboxTopping3.Checked) delTopping += fTopping3;
delTopping("토핑", (int)numEa.Value);
flboxOrderRed("----------------------------------");
flboxOrderRed(string.Format("전체 주문 가격은 {0}원 입니다.", _iTotalPrice));
}
#region Function
/// <summary>
/// O : 선택안함, 1 : 오리지널, 2 : 씬
/// </summary>
/// <param name="iOrder"></param>
/// <returns></returns>
private int fDow(int iOrder)
{
string strOrder = string.Empty;
int iPrice = 0;
if (iOrder == 1)
{
iPrice = 10000;
strOrder = string.Format("도우는 오리지널을 선택 하셨습니다. ({0}원)", iPrice.ToString());
}
else if (iOrder == 2)
{
iPrice = 11000;
strOrder = string.Format("도우는 씬을 선택 하셨습니다. ({0}원)", iPrice.ToString());
}
else
{
strOrder = "도우를 선택하지 않았습니다.";
}
flboxOrderRed(strOrder);
return _iTotalPrice = _iTotalPrice + iPrice;
}
/// <summary>
/// O : 선택안함, 1 : 리치골드, 2 : 치즈크러스터
/// </summary>
/// <param name="iOrder"></param>
/// <returns></returns>
private int fEdge(int iOrder)
{
string strOrder = string.Empty;
int iPrice = 0;
if (iOrder == 1)
{
iPrice = 1000;
strOrder = string.Format("엣지는 리치골드를 선택 하셨습니다. ({0}원)", iPrice.ToString());
}
else if (iOrder == 2)
{
iPrice = 2000;
strOrder = string.Format("엣지는 치즈크러스터를 선택 하셨습니다. ({0}원)", iPrice.ToString());
}
else
{
strOrder = "엣지는 선택하지 않았습니다.";
}
flboxOrderRed(strOrder);
return _iTotalPrice = _iTotalPrice + iPrice;
}
public int fCallBackDelegate(int i, delFuncDow_Edge dFunction)
{
return dFunction(i);
}
private int fTopping1(string Order, int iEa)
{
string strOrder = string.Empty;
int iPrice = iEa * 500;
strOrder = string.Format("소세지 {0} {1} 개를 선택 하였습니다. : ({2}원 (1ea 500원)", Order, iEa, iPrice);
flboxOrderRed(strOrder);
return _iTotalPrice = _iTotalPrice + iPrice;
}
private int fTopping2(string Order, int iEa)
{
string strOrder = string.Empty;
int iPrice = iEa * 200;
strOrder = string.Format("감자 {0} {1} 개를 선택 하였습니다. : ({2}원 (1ea 200원)", Order, iEa, iPrice);
flboxOrderRed(strOrder);
return _iTotalPrice = _iTotalPrice + iPrice;
}
private int fTopping3(string Order, int iEa)
{
string strOrder = string.Empty;
int iPrice = iEa * 300;
strOrder = string.Format("치즈 {0} {1} 개를 선택 하였습니다. : ({2}원 (1ea 300원)", Order, iEa, iPrice);
flboxOrderRed(strOrder);
return _iTotalPrice = _iTotalPrice + iPrice;
}
private void flboxOrderRed(string strOrder)
{
lboxOrder.Items.Add(strOrder);
}
#endregion
}
}
콜백 메서드는 어떤것인지 알아보자!
Delegate가 인자가 되는것이다. 함수들을 하나로 가져갈 수가 있다?!
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace _24_DelegatePizzaOrder
{
public partial class Form1 : Form
{
public delegate int delFuncDow_Edge(int i);
int _iTotalPrice = 0;
public Form1()
{
InitializeComponent();
}
private void btnOrder_Click(object sender, EventArgs e)
{
delFuncDow_Edge delDow = new delFuncDow_Edge(fDow);
delFuncDow_Edge delEdge = new delFuncDow_Edge(fEdge);
int iDowOrder = 0;
int iEdgeOrder = 0;
//Dow 호출
if (rdoDow1.Checked)
{
iDowOrder = 1;
}
else if(rdoDow2.Checked)
{
iDowOrder = 2;
}
// delDow(iDowOrder);
// Edge 호출
if (rdoEdge1.Checked)
{
iEdgeOrder = 1;
}
else if (rdoEdge2.Checked)
{
iEdgeOrder = 2;
}
// delEdge(iEdgeOrder);
fCallBackDelegate(iDowOrder, delDow);
fCallBackDelegate(iEdgeOrder, delEdge);
}
#region Function
/// <summary>
/// 0: 선택 안함 1: 오리지널 2 : 씬
/// </summary>
/// <param name="iOrder"></param>
/// <returns></returns>
private int fDow(int iOrder)
{
string strOrder = string.Empty;
int iPrice = 0;
if (iOrder == 1)
{
iPrice = 10000;
strOrder = string.Format("도우는 오리지널을 선택하셨습니다. ({0}원) ", iPrice.ToString());
}else if (iOrder == 2)
{
iPrice = 11000;
strOrder = string.Format("도우는 씬을 선택하셨습니다. ({0}원) ", iPrice.ToString());
}else
{
strOrder = "도우를 선택하지 않았습니다";
}
lboxOrder.Items.Add(strOrder);
return _iTotalPrice = _iTotalPrice + iPrice;
}
/// <summary>
/// 0: 선택 안함 1: 리치골드 2 : 치즈크러스트
/// </summary>
/// <param name="iOrder"></param>
/// <returns></returns>
private int fEdge(int iOrder)
{
string strOrder = string.Empty;
int iPrice = 0;
if (iOrder == 1)
{
iPrice = 1000;
strOrder = string.Format("엣지는 리치골드를 선택하셨습니다. ({0}원) ", iPrice.ToString());
}
else if (iOrder == 2)
{
iPrice = 2000;
strOrder = string.Format("엣지는 치즈크러스터 선택하셨습니다. ({0}원) ", iPrice.ToString());
}
else
{
strOrder = "엣지를 선택하지 않았습니다";
}
lboxOrder.Items.Add(strOrder);
return _iTotalPrice = _iTotalPrice + iPrice;
}
public int fCallBackDelegate(int i, delFuncDow_Edge deFunction)
{
return deFunction(i);
}
#endregion
}
}
'Some Memos > C#' 카테고리의 다른 글
C# WINFORMS DataRow, DataTable, DataSet (0) | 2023.04.27 |
---|---|
C# WINFORMS 자료구조 #2 List, HashTable, Dictionary (0) | 2023.04.26 |
C# WINFORMS 자료구조1 Queue, Stack (0) | 2023.04.25 |
C# RowIndex, ColumnIndex 수정중 (0) | 2023.04.25 |
C# WINFORMS Timer (Clicker Game) (0) | 2023.04.24 |