방프리

21.03.14 Chapter3. 제네릭 활용 (Item 23) 본문

C#/Effective C#

21.03.14 Chapter3. 제네릭 활용 (Item 23)

방프리 2021. 3. 14. 18:08

Item 23 : 타입 매개변수에 대해 메서드 제약 조건을 설정하려면 델리게이트를 활용하라.

 

특정 행위를 하는 클래스를 생성할 때 메서드를 이용하기보다는 델리게이트로 구현하는 방법이 더 

효율적인 경우가 있다. 예로 캐릭터들의 이동이라는 함수를 만들 때 모든 캐릭터들은 이동을 하기 때문에

IMove라는 인터페이스를 만든 후 구현하는 것이 보편적이다. 하지만 Move()라는 메서드를 호출하기 위해 

IMove 인터페이스를 만들고 그것을 상속하고... 작업량이 굉장히 많아진다. 

하지만 이 메서드를 생성하는 방식 대신에 델리게이트를 이용한다면 굳이 인터페이스를 생성하지 않고

불필요한 작업량을 줄일 수 있다 (= 코드 양을 줄일 수 있다.)

public static class ReplaceInterface
{
    public static T Add<T>(T left, T right, Func<T, T, T> AddFunc) =>
        AddFunc(left, right);
        
    public static T AddFunc(T left, T right)
    {
    	return left + right;
    }
}

//when use delegate
void Main()
{
    int aValue = 6;
    int bValue = 7;
    int sum = ReplaceInterface.Add(a, b, (x, y) => x + y);
}

특정 매개변수를 받는 생성자 시퀸스 함수를 호출할 때에도, 타입 제약조건으로 '매개변수가 있는' 생성자를 설정할 수 

없는데 마찬가지로 델리게이트를 사용하면 제약을 둘 수 있다.

이럴 경우 여러 가지 타입을 다 받을 수 있게 되는데, 인터페이스 구현시 예상으로 들어올 타입에 대한 오버라이드 함수 

구현을 모두 해주어야 한다.

Comments