반응형
기존에 사용중인 컬렉션 타입에 영향을 주지 않으면서 새로운 기능을 추가하고 싶다면 구체화된 컬렉션 타입에 대해 확장 메서드를 작성하면 된다.
public class Customer
{
public string Name { get; set; }
}
확장 메서드를 사용하지 않는 경우
public class CustormerList : List<Customer>
{
public void SendEmailCoupons(Coupon speicalOffer);
public static IEnumerable<Customer> LostProspects();
}
확장 메서드는 IEnumerable를 기반으로 작성됐지만 파생 클래스에서 메서드를 추가하는 방식은 List를 기반으로 한다. List<T>는 IEnumerable<T>를 상속받고 있기 때문에 LINQ와 같은 이터레이터 메서드를 사용할 수 없다. 상속을 잘 못 사용한 예이다.
확장 메서드를 사용하는 경우
public static void SendEmail(this IEnumerable<Customer> customers, Coupon speicalOffer)
{
foreach(var customer in customers)
{
Console.WriteLine($"Sending email to {customer.Name}");
}
}
public static IEnumerable<Customer> LostProspects(this IEnumerable<Customer> targetList)
{
return targetList.Where... 생략
}
이러한 확장 메서드를 사용하는 경우 어떤 컬렉션 타입이든 IEnumerable<Customer> 인터페이스를 구현하고 있으면 해당 메서드를 사용할 수 있다.
사용 예시
// 배열 사용 예시
var customerArray = new Customer[]
{
new Customer { Name = "Piggy" },
new Customer { Name = "Pig" },
new Customer { Name = "Bob" }
};
customerArray.SendEmail("CouponNumber:123");
var lostProspectsArray = customerArray.LostProspects();
foreach (var customer in lostProspectsArray)
{
Console.WriteLine(customer.Name);
}
// 리스트 사용 예시
var customerList = new List<Customer>
{
new Customer { Name = "Piggy" },
new Customer { Name = "Pig" },
new Customer { Name = "Bob" }
};
customerList.SendEmail("CouponNumber:456");
var lostProspectsList = customerList.LostProspects();
foreach (var customer in lostProspectsList)
{
Console.WriteLine(customer.Name);
}
결론
구체화된 제네릭 타입을 살펴보고 논리적으로 어떤 메서드가 추가돼어야 하는지 재검토 해야 한다. 구체화된 제네릭 타입을 상속하여 메서드를 추가하기보다는 확장 메서드를 구현하는게 훨씬 낫다.
본 게시글은 Effective C#을 읽고 정리하였습니다.
반응형
'책 > Effective C#' 카테고리의 다른 글
Effective C# - Item 30 루프보다 쿼리 구문이 낫다 (1) | 2024.03.07 |
---|---|
Effective C# - Item 29 컬렉션을 반환하기보다 이터레이터를 반환하는 것이 낫다 (0) | 2024.02.02 |
Effective C# - Item 27 인터페이스는 간략히 정의하고 기능의 확장은 확장메서드를 사용하라 (1) | 2024.01.19 |
Effective C# - Item 26 제네릭 인터페이스와 논제네릭 인터페이스를 함께 구현하라 (0) | 2023.12.20 |
Effective C# - Item 25 타입 매개변수로 인스턴스 필드를 만들 필요가 없다면 제네릭 메서드를 정의하라 (0) | 2023.12.18 |
댓글