34. Naked type constraint

זהו כנראה ההסבר האחרון על constraintים בgenerics.

(אנחנו עוד נראה ונשתמש בהם הרבה, אבל יהיה מדובר בטריקים ולא בהסברים על הFeatureים)

נניח שיש לנו מתודה גנרית עם מספר Typeים גנריים.

נוכל לכתוב בconstraint איזושהי יחס בין הטיפוסים הגנריים:

למשל נניח שיש לנו מתודה שמוצאת מקסימום, באמצעות IComparer (זהו ממשק שמאפשר לנו לעשות Compare בלי לממש ICompareable):

נוכל במקום להעביר את הIComparer לפונקציה לקבל את הסוג שלו וליצור אותו במתודה.

דוגמת קוד:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public static T Max<T, TComparer>(T[] array)
where TComparer : IComparer<T>, new()
{
if (array.Length == 0)
{
throw new ArgumentException("Array was empty",
"array");
}
else
{
TComparer comparer = new TComparer();
T currentMax = array[0];
foreach (T element in array)
{
if (comparer.Compare(element, currentMax) > 0)
{
currentMax = element;
}
}
return currentMax;
}
}

שימו לב לconsraint where TComparer : IComparer<T>, new(), בעצם יש לנו כאן constraint שמקשר בין שני הTypeים שמגיעים למתודה.

לT קוראים naked type constraint.

קריאה למתודה היא כבר לא implicity אלא explicity:

1
2
3
4
public class MyComparer : IComparer<string>
string[] fruits = { "Apple", "Banana", "Orange", "Mango" };
string bestFruit = Max<string, MyComparer>(fruits);

באופן דומה אפשר לעשות דברים כאלה:

1
public static U Copy<T, U>(T input) where U : T

כלומר להכריח את אחד הTypeים להיות Base class של השני.

יום גנרי טוב

שתף