델리게이트는 어디에서 사용합니까? [닫은]


109

대표자를 요구하는 실제 장소는 무엇입니까? 이 방법이 가장 좋은 솔루션 인 상황이나 패턴이 무엇인지 궁금합니다. 코드가 필요하지 않습니다.

답변:


33

대리자는 특정 종류의 메서드를 정의하는 명명 된 형식입니다. 클래스 정의가 정의하는 지정된 종류의 개체에 대한 모든 멤버를 레이아웃하는 것처럼 대리자는 정의하는 메서드 종류에 대한 메서드 서명을 레이아웃합니다.

이 명령문을 기반으로 대리자는 함수 포인터이며 해당 함수의 모양을 정의합니다.

대리자의 실제 응용 프로그램에 대한 좋은 예는 Predicate 입니다. 링크의 예에서 Array.Find 는 검색 할 배열을 선택한 다음 찾을 항목의 기준을 처리하는 조건자를 사용합니다. 이 경우 Predicate 서명과 일치하는 메서드 ProductGT10을 전달합니다.


154

에 명시된 바와 같이 "학습 C # 3.0 : 마스터 C # 3.0의 기본"

일반적인 시나리오 : 국가 원수가 사망하면 일반적으로 미국 대통령은 장례식에 개인적으로 참석할 시간이 없습니다. 대신 그는 대리인을 파견합니다. 종종이 대표는 부통령이지만 부통령이없는 경우도 있으며 대통령은 국무 장관이나 영부인과 같은 다른 사람을 보내야합니다. 그는 자신의 위임 된 권한을 한 사람에게 "고정"하고 싶지 않습니다. 그는 올바른 국제 프로토콜을 실행할 수있는 모든 사람에게이 책임을 위임 할 수 있습니다.

대통령은 어떤 책임을 위임할지 (장례식 참석), 전달할 매개 변수 (애도, 친절한 말), 그가 되찾고 싶은 가치 (선의)를 미리 정의합니다. 그런 다음 그는 회장직 과정이 진행됨에 따라 "실행 시간"에 위임 된 책임에 특정 사람을 지정합니다.

시나리오 프로그래밍에서 : 특정 작업을 실행해야하는 상황에 직면하는 경우가 많지만 실행하기 위해 호출 할 메서드 또는 개체를 미리 알지 못합니다.

예 : 버튼은 알림이 필요한 개체를 모를 수 있습니다. 단추를 특정 개체에 연결하는 대신 단추를 대리자에 연결 한 다음 프로그램이 실행될 때 해당 대리자를 특정 메서드로 확인합니다.


1
그렇다면 단순히 익명 함수 / 람다를 사용하지 않는 이유는 무엇입니까?
Pacerier 2014

5
@Pacerier 이것은 늦은 응답이며 답을 찾았을 수도 있지만 이것을 찾은 다른 독자를 위해 익명 기능은 일종의 대리인입니다.
Anthony

10
@ Anthony + Pacerier : 성가신 메서드는 델리게이트가 아닙니다. 익명 메서드는 코드 조각입니다. 델리게이트는 해당 코드를 가리키는 포인터입니다. 당신은 그것을 가리키는 델리게이트없이 성가신 메서드를 가질 수 없습니다. 그렇지 않으면 결코 호출되지 않을 것입니다. 람다는 람다 식을 구성하는 데 사용되는 연산자입니다. 람다 식은 대부분 대리자가 가리키는 성가신 메서드를 생성합니다.
마틴 멀더

어리석은 일이지만 버튼을 눌렀을 때 사용법을 모르는 경우 If ElseIf 문을 만들 것입니다. 나는 바보라고 말했다.
JustJohn

@Pacerier 익명 메서드는 C # 2.0에 도입되었고 Lambda는 C # 3.0에 도입되었습니다. 만약 Lambda가 먼저 도입된다면, 익명 메서드와 위임도 없었을 것입니다!
AminM

18

일반 목록에 대한 델리게이트의 일반적인 용도 중 하나는 Action 델리게이트 (또는 이에 상응하는 익명)를 통해 각 작업에 대해 한 줄로 만드는 것입니다.

myList.Foreach( i => i.DoSomething());

또한 Predicate 대리자는 List를 검색하거나 정리하는 데 매우 유용합니다.

myList.FindAll( i => i.Name == "Bob");    
myList.RemoveAll( i => i.Name == "Bob");

코드가 필요 없다고 말씀 하셨지만 코드를 통해 그 유용성을 표현하는 것이 더 쉽습니다. :)


13

이벤트를 이벤트 처리기에 바인딩하는 것은 일반적으로 델리게이트에 대한 첫 번째 소개입니다 ... 델리게이트가 EventHandler 클래스에 래핑되어 있기 때문에 사용 중인지조차 모를 수 있습니다.


5

실제 코드에서 Delegate 패턴이 사용되는 방식에 관심이 있다면 Mac OS X의 Cocoa보다 더 이상 보지 마십시오. Cocoa는 Mac OS X에서 프로그래밍 할 때 Apple이 선호하는 UI 툴킷이며 Objective C로 코딩되어 있습니다. 각 UI 구성 요소가 서브 클래 싱이나 기타 수단이 아닌 위임을 통해 확장되도록 설계되었습니다.

자세한 내용은 여기에서 대리인에 대한 Apple의 의견을 확인하는 것이 좋습니다 .


5

win32 Python을 사용하는 프로젝트가 있습니다.

여러 가지 이유로 일부 모듈은 odbc.py를 사용하여 DB에 액세스하고 다른 모듈은 pyodbc.py를 사용했습니다.

두 종류의 모듈에서 함수를 사용해야 할 때 문제가있었습니다. 연결 개체가 인수로 전달되었지만 dbi.dbiDate 또는 datetime을 사용하여 시간을 나타낼 지 여부를 알아야합니다.

이는 odbc.py가 SQL 문의 값으로 날짜를 dbi.dbiDate로 예상 한 반면 pyodbc.py는 datetime 값을 예상했기 때문입니다.

또 다른 문제는 odbc.py 및 pyodbc.py에 의해 생성 된 연결 객체가 추가 필드를 설정할 수 없다는 것입니다.

내 솔루션은 odbc.odbc (...) 및 pyodbc.pyodbc (...)에서 반환 된 연결 객체를 추가 필드의 값으로 원하는 시간 표현 함수를 포함하고 위임하는 위임 클래스를 래핑하는 것입니다. 다른 모든 필드는 원래 연결 개체에 요청합니다.


5

나는 당신과 같은 질문이 있었고 대답을 위해이 사이트에 갔다.

분명히이 스레드의 예제를 훑어 보았지만 더 잘 이해하지 못했습니다.

나는 지금 내가 읽은 대리인에게 큰 사용을 발견했다 : http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx

Forms는 POST / GET (QueryString)을 사용하는 ASP.NET 웹 사이트보다 값을 전달하는 것이 훨씬 더 복잡하기 때문에 신규 사용자에게는 더 분명해 보일 수 있습니다.

기본적으로 "TextBox text " 를 매개 변수로 사용하는 델리게이트를 정의합니다 .

// Form1

// Class Property Definition
public delegate void delPassData(TextBox text);


// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
     Form2 frm= new Form2();
     delPassData del=new delPassData(frm.funData);
     del(this.textBox1);
     frm.Show();
}

// 요약 : 대리자를 정의하고, 새 Form2 클래스를 인스턴스화하고, funData () 함수를 대리자에 할당하고, 텍스트 상자를 대리자에게 전달합니다. 양식을 보여주십시오.

// Form2

public void passData(TextBox txtForm1)
{

     label1.Text = txtForm1.Text;
}

// 요약 : 간단히 TextBox txtForm1을 매개 변수로 사용하고 (대리자에 정의 된대로) 레이블 텍스트를 textBox의 텍스트에 할당합니다.

나는 이것이 델리게이트에 대한 약간의 사용을 깨달았 으면 좋겠다 :) ..


Form2 클래스 메서드의 이름을 funData (passData 대신)로 지정하거나 Form1 함수 할당의 이름을 frm.passData (frm.funData 대신)로 지정해야합니다.
ethan

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.