2010-01-08 7 views
0

약간의 비틀어서 관찰자 패턴을 구현하려고하는데 Subject와 Observer가 같은 클래스입니다. 예 :Observer 패턴 C# generics 사용

class myclass 
{ 
    public delegate void UpdateHandler(object sender); 

    public event UpdateHandler UpdateEvent; 

    public Attach(myclass obj){ // use delegate to attach update function of obj} 

    public Update(object sender){ // do something with sender} 

    public Notify() { // use UpdateEvent to update all attached obj's } 

} 

이렇게하면 정상적으로 작동합니다. 이제 나는 업데이트 이벤트가있을 때마다 권투 및 언 박싱에 의해 부과 된 성과 패널티를 제거하여 객체 기반 구현을 제거하고 제네릭을 사용하려고합니다. 예를 들어,

class myclass<Tin, Tout> 
{ 
    public delegate void UpdateHandler(Tout sender); 

    public event UpdateHandler UpdateEvent; 

    public Attach(myclass<Tin,Tout> obj) 
     { // use delegate to attach update function of obj} 

    public Update(Tin sender){ // do something with sender} 

    public Notify() 
     { // use UpdateEvent to update all attached obj's 
     // but now we have to send Tout 
     } 

} 

이것은 내가 한 이벤트 핸들러를 가지고 있기 때문에, 그것은 주석 또는 투트 수 있지만 둘 수 있습니다 작동하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까? 디자인을 변경하는 다른 제안도 환영합니다. 이것을 읽어 주셔서 대단히 감사합니다. 그리고이 질문을 이해하기에 충분할만큼 분명하기를 바랍니다.

+2

값 유형을 사용하지 않으므로이 코드에는 권투가 없습니다. – SLaks

+0

좋아요, 이건 더 기본적인 것 같아요. 함수에서 객체를 얻었을 때 제 타입으로 캐스팅해야 할 때가 있습니다. 성능상의 불이익은 없었습니까? – fadini

+0

이벤트는 이미 관찰자 패턴을 구현합니다. 이벤트에 원하는 대리인을 첨부하여 목록에 추가 할 수 있습니다. 이 이벤트는 귀하가 원하는 모든 정보를 전달할 수 있습니다. 뭐가 문제 야? –

답변

2
도 이벤트 핸들러를 변경

:

public delegate void UpdateHandler<Tin>(Tin sender); 

public event UpdateHandler<Tin> UpdateEvent; 
+0

나는 당신을 정확하게 이해하고, 이것을 시도했으나 효과가 없었습니까? – fadini

+0

그래, 구문이 약간있을 수 있지만이 방법을 사용할 수 있습니다. 이 처리기에 무엇을 전달하고 있습니까? 주석 참조 또는 TOut 또는 둘 다? 요점은 대리인의 제네릭이 권투/언 박싱 문제를 줄일 수 있다는 것입니다. –

+0

나는 주석을 넣고 붙이고 있습니다. 그럼 나는 Tout을 부르고있다. 하지만이 경우에는 복싱/언 박싱이 없습니까? – fadini

0

체크 아웃 this question과 응답. 강력하게 유형이 지정된 제네릭을 사용하는 pub/sub의 아주 좋은 구현입니다.

+0

나는 그것을 보게 될 것이다, 그것은 언젠가 모든 것을 해석하기 위해 나를 데려 갈 것이다. 감사 – fadini