06-05-2010, 23:20
|
|
|
|
חבר מתאריך: 05.05.02
הודעות: 6,840
|
|
זה בלוף טילים.
כל מה שנותנים Generics ב-C# זה syntactic sugar לפולימורפיזם.
תצטרך להיות יותר ברור מה כוונך.
אני משער ששנינו מסכימים כי Generics נותנים ליצור מעין מחלקה אבסטרקטית שפרטי המימוש שלה זה המחלקות בה היא משתמשת. אני לא יודע אם זה יכול להיכנס למילים שלך.
הטריק של זה שלא
עושים boxing (אגב, אתה יודע שבג'אווה כן יש autoboxing במקרה הזה?) הוא באמת
פולימורפיזם ב-C# בניגוד לבג'אווה, מאחר ובג'אווה הטיפוסים הפרימיטיביים הם שונים באופן
מהותי מכל המחלקות שיורשות מ-java.lang.Object, בעוד שבב-CTS של דוטנט (וזה כולל
את C#...) כל הטיפוסים (כולל "פרימיטיביים") יורשים מ-System.Object.
אולי לא הייתי ברור כי אני לא מבין איך נכנס לדיון הקטע של הירושה מ-Object. הירושה מ-Object בעיקר בעלת משמעות במקרה של boxing, וזה בדיוק מה שהסברתי שלא קורה.
אני אסביר שוב:
נגיד מגדירים מחלקה גנרית <Bla<T עם Data member מטיפוס T. אם עושים <new Bla<object אז יוקצה לאובייקט מקום נוסף בגודל של pointer ואם עושים <new Bla<int יוקצה לאובייקט מקום נוסף בגודל של int לאסכון הערך.
העובדה כי int יורש מ-Object אינה משנה כלל להסבר הנ"ל.
זה שאין casting ב-C# מ-containers גנריים שונים זה העדר פיצ'ר ולא תכונה גאונית של
ה-Generics ב-C#, והיא אמורה להיות מתוקנת ב-C# 4.0. אני ממליץ לך לקרוא את הפוסטים
הרלבנטיים בבלוג של אריק ליפרט (ובכלל את הבלוג שלו).
אני מכיר את מה שיש בC# 4 אבל שים לב שבניגוד ל"פיצ'ר" של java, ניתן לעשות cast רק למחלקות יורשות או מחלקות אב, וזה רק אם הן מוגדרות כ-out או in (בהתאם או הפוך, לא זוכר). מיקרוסופט עשו הכל כדי לשמור עדיין על type safety.
תחשוב שאם יש לך מחסנית של T, לא הגיוני שתוכל לעשות cast למחסנית של Object כי אז ה-Push לא יהיה אtype safe ולא הגיוני שתוכל לעשות cast למחסנית של K היורש מ-T כי אז Pop לא יהיה type safe.
הביטוי "בקריאה למתודות, אין casting שרץ מאחורי הקוד" אינו מובן.
הכוונה היא למשל כאשר למחסנית של T עושים Pop אז לא מתבצע cast מ-Object ל-T (אין בדיקה ואין פתח ל-CastException, הכל type safe).
|