다음을 통해 공유


대리자의 가변성 활용(C#)

대리자에게 메서드를 할당하면 공변성반공변성이 메서드 시그니처와 대리자 형식을 일치시키는 유연성을 제공합니다. 공변성을 통해 메서드는 대리자에 정의된 반환 형식보다 더 파생된 반환 형식을 사용할 수 있습니다. 반공변성은 대리자 타입의 매개변수 타입보다 덜 파생된 타입을 사용하는 메서드를 허용합니다.

예제 1: 공변성

설명

이 예제에서는 대리자 서명의 반환 형식에서 파생된 반환 형식이 있는 메서드와 대리자를 사용할 수 있는 방법을 보여 줍니다. 반환되는 DogsHandler의 데이터 형식은 대리자에 정의된 Dogs 형식에서 파생된 Mammals 형식입니다.

코드

class Mammals {}  
class Dogs : Mammals {}  
  
class Program  
{  
    // Define the delegate.  
    public delegate Mammals HandlerMethod();  
  
    public static Mammals MammalsHandler()  
    {  
        return null;  
    }  
  
    public static Dogs DogsHandler()  
    {  
        return null;  
    }  
  
    static void Test()  
    {  
        HandlerMethod handlerMammals = MammalsHandler;  
  
        // Covariance enables this assignment.  
        HandlerMethod handlerDogs = DogsHandler;  
    }  
}  

예제 2: 반공변성

설명

이 예제에서는 대리자 서명 매개 변수 형식의 기본 형식인 매개 변수가 있는 메서드에서 대리자를 사용하는 방법을 보여 줍니다. 반공변성을 통해 별도의 핸들러 대신 하나의 이벤트 핸들러를 사용할 수 있습니다. 다음 예제에서는 두 대리자를 사용합니다.

  • KeyEventHandler Button.KeyDown 이벤트의 서명을 정의하는 대리자입니다. 서명은 다음과 같습니다.

    public delegate void KeyEventHandler(object sender, KeyEventArgs e)
    
  • MouseEventHandler Button.MouseClick 이벤트의 서명을 정의하는 대리자입니다. 서명은 다음과 같습니다.

    public delegate void MouseEventHandler(object sender, MouseEventArgs e)
    

이 예제에서는 EventArgs 매개 변수를 사용하여 이벤트 처리기를 정의하고, 이를 사용하여 Button.KeyDown 이벤트와 Button.MouseClick 이벤트를 모두 처리합니다. EventArgsKeyEventArgsMouseEventArgs의 기본 형식이기 때문에 이 작업을 수행할 수 있습니다.

코드

// Event handler that accepts a parameter of the EventArgs type.  
private void MultiHandler(object sender, System.EventArgs e)  
{  
    label1.Text = System.DateTime.Now.ToString();  
}  
  
public Form1()  
{  
    InitializeComponent();  
  
    // You can use a method that has an EventArgs parameter,  
    // although the event expects the KeyEventArgs parameter.  
    this.button1.KeyDown += this.MultiHandler;  
  
    // You can use the same method
    // for an event that expects the MouseEventArgs parameter.  
    this.button1.MouseClick += this.MultiHandler;  
  
}  

참고하십시오