בהמשך לשבוע הגנרי הטוב,
נניח שיש לנו פונקציה פשוטה שמוצאת מקסימום של מערך נתון:
|
|
כרגיל לשבוע, אין שום דבר מיוחד בint, והיינו רוצים שהפונקציה תעבוד גם לchar, ulong, long וכו’.
אלא שכשננסה להפוך את הפונקציה לגנרית נקבל את השגיאה הבאה בקימפול:
|
|
Operator ‘ ‘T’ does not contain a definition for ‘CompareTo’ and no extension method ‘CompareTo’ accepting a first argument of type ‘T’ could be found (are you missing a using directive or an assembly reference?)
כדי לפתור בעיות מסוג וכאלה, המציאו עוד כלי מאוד חזק לעבודה עם Generics – Generic constraints.
הפונקציה CompareTo אכן קיימת, אבל בממשק IComparable (או IComparable<T>).
היינו רוצים בעצם שרק T שמממש את IComparable יוכל להיכנס לפונקציה הזאת.
נוכל לעשות זאת כך:
|
|
הwhere מציין שהפונקציה יכולה לקבל רק T שמקיים את התנאים הכתובים אחריו.
נוכל לכתוב שם בין השאר איזה ממשקים אנחנו רוצים שT יממש, ומאיזה מחלקה אנחנו רוצים שהוא ירש.
על המחלקה שאנחנו רוצים שהוא ירש ממנה יש מספר הגבלות: היא לא יכולה להיות System.Array (תכתבו פשוט T[] בארגומנטים), System.Delegate, System.Enum, System.ValueType או object.
נראה הרבה מאוד דברים מגניבים שאפשר לעשות עם זה בטיפים הבאים.
יום גנרי מעולה