닷넷에서 위임이란.

특정한 형태를 갖는 하나 이상의 함수를 호출할 수 있는 클래스다 라고 정의되어 있던데.

개인적으로는 C++의 함수포인터랑 비슷하다.
C++의 함수포인터는 어느 함수안에서도 선언해서 쓸 수 있고 다른 함수를 가리키도록 변경이 가능하지만 닷넷에서 위임기능은 일단 생성후에는 위임이 가리키고 있는 함수를 변경할 수 없다.

그럼 뭐에 쓰느냐. 다중 위임기능를 이용해서 여러 함수 호출하는것을 하나로 묶어서 한큐에 실행 할 수 있다 라는 이런 장점(?)이 있어 보인다. 실무에서는 어떠한 용도로 쓰는지는 잘 모르겠다.

static 멤버함수 위임하기.

using namespace System;
__delegate double NumericOp(double);
__gc class Ops{
	public:
	static double square(double d){
		return d*d;
	}
};

int main(){
	NumericOp *pOp = new NumericOp(0,&Ops::square);
	double a = 3.3;
	a = pOp->Invoke(a);
	Console::WriteLine(a);
	return 0;
}

멤버함수 위임하기

using namespace System;
__delegate double NumericOp(double);
__gc class Ops{
	public:
	double square(double d){
		return d*d;
	}
};

int main(){
	Ops *op = new Ops();
	NumericOp *pOp = new NumericOp(op,&Ops::square);
	double a = 3.3;
	a = pOp->Invoke(a);
	Console::WriteLine(a);
	return 0;
}

다중멤버함수 위임하기

using namespace System;
__delegate void NumericOp();
__gc class Ops{
	public:
	void test(){
		Console::WriteLine(L"MulticastDelegate Test1");
	}
};

__gc class Ops2{
	public:
	void test(){
		Console::WriteLine(L"MulticastDelegate Test2");
	}
};

int main(){
	Ops *op = new Ops();
	Ops2 *op2 = new Ops2();

	NumericOp *pOp = new NumericOp(op,&Ops::test);
	NumericOp *pOp2 = new NumericOp(op2,&Ops2::test);

	NumericOp *pOp3 = dynamic_cast<NumericOp*>(Delegate::Combine(pOp,pOp2));

	pOp3->Invoke();
	return 0;
}

pOp3 하나로 두개를 한큐에 호출할 수도 있고 나중에 이것저것 조합해서 한큐에 여러개를 실행 할 수 있다는 장점이 있다. 조합한 위임도 중간에 원하지 않는 것은 넣다 뺐다 할 수 있으니 마음껏 조합하시라.


Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다