這個做法提到了一個新的名詞叫做 Constructed Types 也叫做 Constructed Generic Type

A constructed generic type, or constructed type, is the result of specifying types for the generic type parameters of a generic type definition.

也就是定義完 Type Parameters 的 Generic Type 也就是跟之前提到的 close generic type 是一樣的意思。

在上一個做法 27 建議是幫介面定義一組擴充方法,也就是在 IEnumerable<T> 定義多種擴充方法,但其實還有專門為特定類型定義的 擴充方法,例如下面這些就是幫 IEnumerable<int> 定義的擴充方法。

public static class Enumerable
{
    public static int Average(this IEnumerable<int> sequence);
    public static int Max(this IEnumerable<int> sequence);
    public static int Min(this IEnumerable<int> sequence);
    public static int Sum(this IEnumerable<int> sequence);
}

了解這種模式後,我們可以寫出發送折價券給指定用戶的擴充方法。

public static void SendEmailCoupons(this IEnumerable<Customer> customers, Coupon specialOffer)

或者是找出過去一個月沒有下訂單的客戶。

public static IEnumerable<Customer> LostProspects(IEnumerable<Customer> targetList)

如果不透過擴充方法也能透過繼承泛型類別建立出新的衍生類別達到同樣的效果,但這種寫法依賴了特定的儲存模型 List<Customer>,這樣對方法的使用者 加上了不必要的限制,也是誤用了繼承這個特性。

public class CustomerList : List<Customer>
{
	public void SendEmailCoupons(Coupon specialOffer)
	public static IEnumerable<Customer> LostProspects()
}

Summary

這個做法可以說是做法 27 的補充說明,還是透過擴充方法的方式來幫泛型介面增加功能性,不過可以另外幫特定的類型實做擴充方法,讓我們的泛型介面的功能更加豐富。