לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #22  
ישן 05-05-2010, 22:21
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 21 שנכתבה על ידי Idjo שמתחילה ב "לפי מה שאני זוכר Generics..."

אתה צודק, אבל אתה גם טועה.

Generics בג'אווה זה באמת בלוף במובן שזה רק syntactice sugar לפולירמופיזם, בניגוד
ל-C++‎ לדוגמה שבה קיים מנגנון ה-templates שבו משתמשים כמעין חלופה ל-Generics
(שחסר ב-C++‎ במידה מסוימת). אבל זה בלוף באותה מידה ב-C#‎.

ה-containers (כלומר המחלקות List, Queue, Set וכו' ב-java.util שיורשות מ-Collection - לא
כולל Array שזה משהו אחר) בג'אווה הם באמת ה-containers שהיו לפני הוספת ה-Generics,
עם תוספת הפיצ'ר של ה-Generics - הפיצ'ר שמאפשר וידוא שמכניסים (ולכן גם מוציאים) רק
אלמנטים מהטיפוס הנכון ב-compile-time במקום זוועת cast-ים ו-exceptions ב-run-time.

מצד שני, עדיין יכול להיות שתרצה לדעת מה הטיפוס הפרמטרי שלך, ואפילו יש מתודה מיוחדת
בשביל זה במחלקה Class - המתודה getTypeParamaters()‎. איך זה עובד ביחד עם מנגנון
ה-type erasure אני לא יודע. מצאתי את הקישורים הבאים עם דוגמות לשימוש בפונקציה. אם
אתה לא מאמין לדוגמות, אתה יכול לבדוק.
בקישור השני אתה גם יכול לראות עוד דוגמה ל"למה שתרצה לדעת מה טיפוס המחלקה שלך",
ואת זה שהטיפוס לא תמיד סטטי. ראיתי דוגמהלקוד כזה בחיים האמיתיים, שלדעתי היה קצת
מזעזע ו-abuse של מנגנון ה-reflection, אבל קוד שרץ בעולם האמיתי בכל-זאת...

זה נראה מאמר רציני בנושא, ויכול להיות שהוא גם עונה על השאלה שלי (איך זה עובד למרות
מנגנון ה-type erasure), אבל אין לי כרגע זמן לקרוא אותו.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #24  
ישן 06-05-2010, 21:06
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 23 שנכתבה על ידי Idjo שמתחילה ב "ב-C# זה לא בלוף, לפחות לא..."

זה בלוף טילים.

כל מה שנותנים Generics ב-C# זה syntactic sugar לפולימורפיזם. הטריק של זה שלא
עושים boxing (אגב, אתה יודע שבג'אווה כן יש autoboxing במקרה הזה?) הוא באמת
פולימורפיזם ב-C# בניגוד לבג'אווה, מאחר ובג'אווה הטיפוסים הפרימיטיביים הם שונים באופן
מהותי מכל המחלקות שיורשות מ-java.lang.Object, בעוד שבב-CTS של דוטנט (וזה כולל
את C#...) כל הטיפוסים (כולל "פרימיטיביים") יורשים מ-System.Object.

זה שאין casting ב-C# מ-containers גנריים שונים זה העדר פיצ'ר ולא תכונה גאונית של
ה-Generics ב-C#, והיא אמורה להיות מתוקנת ב-C# 4.0. אני ממליץ לך לקרוא את הפוסטים
הרלבנטיים בבלוג של אריק ליפרט (ובכלל את הבלוג שלו).

הביטוי "בקריאה למתודות, אין casting שרץ מאחורי הקוד" אינו מובן.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #25  
ישן 06-05-2010, 23:20
צלמית המשתמש של Idjo
  Idjo Idjo אינו מחובר  
 
חבר מתאריך: 05.05.02
הודעות: 6,840
בתגובה להודעה מספר 24 שנכתבה על ידי פסטן שמתחילה ב "זה בלוף טילים. כל מה שנותנים..."

זה בלוף טילים.

כל מה שנותנים 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).
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 18:21

הדף נוצר ב 0.08 שניות עם 12 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר