שאלה מעניינת על ReadOnlyDictionary

Engineer2

New member
שאלה מעניינת על ReadOnlyDictionary

ב- NET 4.5. יש קלאס חדש שנקרא ReadOnlyDictionary.
הקלאס הזה יורש ממשק
IDictionary
הוא הפונקציה Add (לדוגמה) לא ממומשת בו, ובכל זאת הוא מתקמפל (למרות ש-IDictionary מכי בתוכו חתימה של Add).
מישהו פה יודע למה הדבר הזה מתקמפל??
 

Miki Watts

New member
מי אמר שהיא לא ממומשת ?

תסתכל עם dotPeek לתוך הקוד של המחלקה, ותראה שהם כן מממשים אותה, אבל זורקים תמיד NotSupportedException

[__DynamicallyInvokable]
void IDictionary<TKey, TValue>.Add(TKey key, TValue value)
{
ThrowHelper.ThrowNotSupportedException(ExceptionResource.NotSupported_ReadOnlyCollection);
}
 

arielRuuubi

New member
זה נקרא להסתיר / להחביא את הפונקציה

אם אני יורש ממחלקה אחרת ונותן פונקציה עם אותה חתימה כמו האבא אני בעצם מסתיר את הפונ של האבא, ואז אני יכול נניח לעשות לה PRIVATE.
&nbsp
למרות שלפי מיקי הם עשו את זה קצת אחרת
 

כלליים

New member
מה פתאום

אם אתה מממש אתה משנה אתה הפונקציה לprivate, תקבל שגיאה שאתה לא מממש את הממשק.
 

ziv1f

New member


303 permanent redirect
 

חמיאל

New member
מימוש פרטי או מימוש מפורש

התשובה בקיצור:
הפונקציה ממומשת במה שנקרא מימוש פרטי. במימוש כותבים את שם הממשק + נקודה + שם הפונקציה.
הפונקציה היא פרטית, והיא לא נראית דרך אובייקטי המחלקה המממשת.
התשובה באריכות - תסתכל בסרטון הזה:
[URL]https://www.youtube.com/watch?v=xkhvGTKq5cw[/URL]
 

hookedat

New member
ההסבר בפנים

למשתנה בשפות תוכנה יש שני מצבים, MUTABLE ו-IMMUTABLE.
זה אומר שאתה יכול לשנות או לא לשנות את האובייקט.
יש שפות שהשימוש בדרך כלל הוא לא לשנות אותו. למה זה טוב ? יש הרבה סיבות, אפרט את הראשונה שעולה לי לראש:
אתה תוכנה שחושפת API או SDK מה שזה לא יהיה שתקרא לזה, אתה חושף את זה למפתח, נניח אני פיפא והמשתמש ביקש ממני רשימת שחקנים במדינת ישראל, אני אחזיר לו LIST ואני אעדיף שהליסט תהיה immutable ככה שלא תוכל לשנות את מה שנתתי לך. אח'כ תוכל ליצור לעצמך מבנה נתונים ולעשות כרצונך עם המידע שנתתי לך.

נחזור לשאלתך, שהם יצרו את READ ONLY DICTONARY הם עושים את המילון immutable לכאורה, דרך אגב היה להם read only collection ורק עכשיו הוציאו את המילון לאור.

בגלל שזה dictionary הם חייבים לממש את כל המתודות של IDictionary כי הם מממשים אותו, ומכאן הם חייבים לממש את ADD. הם זורקים אקספשין כי זה המטרה.
 
למעלה