בהמשך לפעם הקודמת, הכרנו קצת את ה Design Pattern ששמוVisitor .
תזכורת: יוצרים איזשהו Class כזה:
|
|
ובCarElement אנחנו דואגים שתהיה פונקציה כזאת:
|
|
שמספרת לVisitor איך הוא אמור לטייל עלינו.
הבעיה העיקרית במימוש הזה הוא שICarElementVisitor סותר את עקרונות הOOP.
הסיבה לכך היא שהממשק ICarElementVisitorמכיר כבר את כל הטיפוסים היורשים מCarElement, ולכן לא מאפשר לנו הרחבה למימושים אחרים של CarElement.
איך אפשר לתקן?
ראשית נדאג שהממשק ICarElementVisitor יקבל רק את הטיפוס הבסיסי:
|
|
כעת המימוש של הVisitor שלנו ישתמש בDynamic Binding כדי למצוא את הOverload המתאים ביותר:
|
|
כאשר לכל טיפוס יש InnerVisit משלו. אם ניקח את הדוגמה מפעם שעברה, כעת היא תמומש כך:
|
|
מה שיקרה זה שבזמן ריצה נמצא הOverload המתאים ביותר, כמו שהיה נמצא בזמן קימפול – בטיפ של אתמול, מאחר ובממשק היו הרבה Overloadים, הוא ידע בזמן קימפול לנתב אותנו לOverload המתאים ביותר. עכשיו בזמן ריצה ננותב למתודה המתאימה ביותר.
הדבר הזה בעצם מאפשר לנו "להוסיף" מתודה וירטואלית ולדרוס אותה עבור כל מימוש שנרצה של CarElement, בניגוד לפעם שעברה, שאפשר לנו "להוסיף" מתודה וירטואלית רק לטיפוסים שאנחנו כבר מכירים. (זה לא מדויק, כי יכולנו לעשות כל מיני בדיקות של if (element is Mazda), אבל תסכימו איתי שזה פחות אלגנטי…)
השימוש, כמו בפעם הקודמת, הוא משהו כזה:
|
|
המשך יום דינאמי טוב