다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.
C#에서 제약조건을 설정하는건 한계가 많은 것 처럼 보인다.
우선 제약 조건을 위해 인터페이스를 구현하는 방식을 생각해 볼 수 있다.
Add() 메서드를 정의하기 위한 예시
- Add() 메서드를 정의하는 IAdd<T> 인터페이스를 생성
- 이 인터페이스를 제약 조건으로 설정
- IAdd<T>를 구현할 클래스를 생성
- IAdd<T>가 정의한 Add()메서드를 구현
꽤 작업량이 많아지며, 클래스의 기본적인 구조를 해친다.
제약 조건으로 델리게이트 사용하기
제약조건으로 델리게이트를 작성하면 추가적인 작업없이 해결 가능하다.
특정 제네릭 클래스가 T타입의 두 객체를 더하는 메서드를 필요로 하는 경우
System.Func<T1, T2, TOutput> 델리게이트를 사용하면 필요한 원형의 델리게이트를 얻을 수 있다.
1) 적절한 메서드의 원형을 고안하고 이를 델리게이트 타입으로 정의한다.
2) 델리게이트의 인스턴스를 제네릭 메서드의 매개변수로 추가한다.
3) 람다 표현식을 인자로 전달한다.
public static class MyClass
{
public static T Add<T>(T left, T right, Func<T, T, T> AddFunc)
=> AddFunc(left, right);
}
int a = 6;
int b = 7;
int sum = Example.Add(a, b, (x, y) => x + y);
결론
- 제약 조건을 설정하기 위해 인터페이스를 사용하기 쉽지 않다면 델리게이트를 이요하라
'🌍 C# Study > 이펙티브 C#' 카테고리의 다른 글
[25] 타입 매개변수로 인스턴스 필드를 만들 필요가 없다면 제네릭 메서드를 정의하라 (0) | 2021.04.27 |
---|---|
[24] 베이스 클래스나 인터페이스에 대해서 제네릭을 특화하지 말라 (0) | 2021.04.27 |
[22] 공변성과 반공변성을 지원하라 (0) | 2021.04.27 |
[21] 타입 매개변수가 IDisposable을 구현한 경우를 대비하여 제네릭 클래스를 작성하라 (0) | 2021.04.27 |
[20] IComparable<T>와 IComparer<T>를 이용하여 객체의 선후 관계를 정의하라 (0) | 2021.04.26 |