대리자의 공변성(Covariance)과 반공변성(Contravariance)(C# 프로그래밍 가이드)

업데이트: 2007년 11월

공변성과 반공변성을 통해 메서드 시그니처와 대리자 형식을 비교할 때 일정 수준의 융통성을 발휘할 수 있습니다. 공변성은 대리자에 정의된 것보다 더 파생된 반환 형식을 갖는 메서드를 사용할 수 있도록 하고, 반공변성은 대리자 형식에서보다 덜 파생된 매개 변수 형식을 갖는 메서드를 사용할 수 있도록 합니다.

예제 1(공변성)

설명

이 예제에서는 대리자 시그니처의 반환 형식에서 파생된 반환 형식을 갖는 메서드를 대리자와 함께 사용하는 방법을 보여 줍니다. SecondHandler에서 반환된 데이터 형식은 대리자에 정의된 Mammals 형식에서 파생된 Dogs 형식입니다.

코드

class Mammals
{
}

class Dogs : Mammals
{
}

class Program
{
    // Define the delegate.
    public delegate Mammals HandlerMethod();

    public static Mammals FirstHandler()
    {
        return null;
    }

    public static Dogs SecondHandler()
    {
        return null;
    }

    static void Main()
    {
        HandlerMethod handler1 = FirstHandler;

        // Covariance allows this delegate.
        HandlerMethod handler2 = SecondHandler;
    }
}

예제 2(반공변성)

설명

이 예제에서는 대리자 시그니처 매개 변수 형식의 기본 형식이 되는 형식의 매개 변수를 갖는 메서드를 대리자와 함께 사용하는 방법을 보여 줍니다. 반공변성을 통해 이전에는 별도의 여러 처리기를 사용해야 했던 위치에서 하나의 이벤트 처리기를 사용할 수 있습니다. 예를 들어, EventArgs 입력 매개 변수를 받아들이는 이벤트 처리기를 만들고 MouseEventArgs 형식을 매개 변수로 보내는 Button.MouseClick 이벤트와 KeyEventArgs 매개 변수를 보내는 TextBox.KeyDown 이벤트에 이 이벤트 처리기를 사용할 수 있습니다.

코드

System.DateTime lastActivity;
public Form1()
{
    InitializeComponent();

    lastActivity = new System.DateTime();
    this.textBox1.KeyDown += this.MultiHandler; //works with KeyEventArgs
    this.button1.MouseClick += this.MultiHandler; //works with MouseEventArgs

}

// Event hander for any event with an EventArgs or
// derived class in the second parameter
private void MultiHandler(object sender, System.EventArgs e)
{
    lastActivity = System.DateTime.Now;
}

참고 항목

개념

C# 프로그래밍 가이드

참조

이벤트(C# 프로그래밍 가이드)

대리자(C# 프로그래밍 가이드)

제네릭 대리자(C# 프로그래밍 가이드)