인터페이스 대신 대리자를 사용해야 하는 경우(C# 프로그래밍 가이드)
업데이트: 2007년 11월
클래스 디자이너는 대리자와 인터페이스 둘 모두를 통해 형식의 선언과 구현을 분리할 수 있습니다. 특정 인터페이스는 모든 클래스나 구조체에서 상속하고 구현할 수 있습니다. 대리자는 메서드 시그니처가 대리자의 메서드 시그니처와 일치하는 모든 클래스의 메서드에 대해 생성될 수 있습니다. 인터페이스나 대리자 메서드를 구현하는 클래스에 대한 정보가 전혀 없는 개체에서 인터페이스 참조나 대리자를 사용할 수 있습니다. 대리자와 인터페이스는 이와 같은 점에서 유사하기 때문에 대리자와 인터페이스 중 어느 쪽을 사용할지 결정할 때는 다음과 같은 지침을 따라야 합니다.
다음과 같은 경우에 대리자를 사용합니다.
이벤트 디자인 패턴을 사용하는 경우
정적 메서드를 캡슐화해야 하는 경우
메서드를 구현하는 개체에 대한 다른 속성, 메서드 또는 인터페이스에 호출자가 액세스할 필요가 없는 경우
쉽게 작성하려는 경우
메서드에 대한 여러 구현이 클래스에 필요한 경우
다음과 같은 경우에 인터페이스를 사용합니다.
호출할 수 있는 관련 메서드의 그룹이 있는 경우
클래스에 메서드의 구현이 하나만 필요한 경우
인터페이스를 사용하는 클래스에서 이 인터페이스를 다른 인터페이스나 클래스 형식에 캐스팅하려는 경우
비교 메서드의 경우와 같이 구현하려는 메서드가 클래스의 형식이나 동일성 여부와 관련되어 있는 경우
대리자 대신 단일 메서드 인터페이스를 사용하는 예로는 IComparable 또는 제네릭 버전인 IComparable<T>을 들 수 있습니다. IComparable은 형식이 동일한 두 개체 사이의 보다 작음, 같음 또는 보다 큼 관계를 지정하는 정수를 반환하는 CompareTo 메서드를 선언합니다. IComparable을 정렬 알고리즘의 기준으로 사용할 수 있습니다. 대리자 비교 메서드를 정렬 알고리즘의 기준으로 사용할 수도 있지만 이 방법은 사용하지 않는 것이 좋습니다. 비교 기능은 클래스에 속한 것이고 비교 알고리즘은 런타임에 변경되지 않으므로 단일 메서드 인터페이스를 사용하는 것이 좋습니다.