728x90
인터페이스를 이용한 메서드 제약
제네릭 클래스에 대해 타입 매개변수 T가 반드시 Add() 메서드를 가져야 한다는 제약 조건을 설정할 때,
- Add() 메서드를 정의하는 IAdd 인터페이스를 생성한다.
- IAdd 인터페이스로 제약 조건을 설정한다.
- IAdd를 구현할 클래스를 생성한다.
- IAdd가 정의한 Add() 메서드를 구현한다.
- 제네릭 클래스의 정의를 이용하여 닫힌 제네릭 클래스를 만든다.
즉, Add() 메서드 하나를 호출하기 위해 IAdd 인터페이스를 구현한 새로운 클래스를 생성한다.
델리게이크를 이용한 메서드 제약
제약조건으로 설정하고 싶은 메서드의 원형에 부합하는 델리게이트를 작성한다.
- 적절한 메서드의 원형을 고안하고 이를 델리게이트 타입으로 정의한다.
- 델리게이트의 인스턴스를 제네릭 메서드의 매개변수로 추가한다.
- 람다 표현식을 인자로 전달한다.
예시 코드
public static class Example
{
public static T Add<T>(T left, T right, Func<T, T, T> AddFunc) =>
AddFunc(left, right);
}
특정 제네릭 클래스가 T 타입의 두 객체를 더하는 메서드를 필요로 한다고 가정할 때, 위와 같이 람다 표현식을 이용하여 Add 메서드를 구현할 수 있다.
호출 코드
int a = 6;
int b = 7;
int sum = Example.Add(a, b, (x, y) => x + y);
반응형
'개발공부 > C#' 카테고리의 다른 글
[Effective C#] 아이템 25 : 타입 매개변수로 인스턴스 필드를 만들 필요가 없다면 제네릭 메서드를 정의하라 (0) | 2021.12.01 |
---|---|
[Effective C#] 아이템 24 : 베이스 클래스나 인터페이스에 대해서 제네릭을 특화하지 말라 (0) | 2021.11.30 |
[Effective C#] 아이템 22 : 공변성과 반공변성을 지원하라 (0) | 2021.11.28 |
[Effective C#] 아이템 21 : 타입 매개변수가 IDisposable을 구현한 경우를 대비하여 제네릭 클래스를 작성하라 (0) | 2021.11.27 |
[Effective C#] 아이템 20 : IComparable<T>와 IComparer<T>를 이용하여 객체의 선후 관계를 정의하라 (0) | 2021.11.26 |