כאשר אנחנו כותבים ממשקים, יש לנו נטייה להכניס להם הרבה פונקציונאליות.
יש לזה חסרון, מכיוון שזה מכריח את מי שמממש את הממשק שלנו לממש הרבה פונקציות.
למשל, ראו את הדוגמה הבאה:
קיים ממשק המייצג גוף המסוגל להסתובב בכל כיוון:
|
|
הפונקציה TurnLeft – גורמת לגוף להסתובב 90 מעלות שמאלה
הפונקציה TurnOpposite – גורמת לגוף להסתובב ב180 מעלות
הפונקציה TurnRight – גורמת לגוף להסתובב ב90 מעלות ימינה
בסה"כ ממשק די פשוט, אלא שכדי לממש אותו, המממש צריך לממש 3 מתודות, מה שמדכא אותו לממש את הממשק הזה.
עוד דוגמה היא כזאת: נניח שיש לנו ממשק עם מתודה:
|
|
(ודמיינו עוד כמה overloadים)
המממש של ממשק זה יהיה מתוסכל, לא רק שהוא צריך לממש מתודה עם 4 ארגומנטים, אלא הוא גם צריך לממש 3 מתודות במחלקה. ועוד הן בסה"כ קוראות לחתימה הארוכה.
בעיות אלה אפשר לפתור בצורה אלגנטית באמצעות extension methods:
בבעיה הראשונה, אם לא חשובה לנו הדרך, אלא רק התוצאה הסופית, נוכל לעשות משהו כזה:
|
|
ונוסיף שני extension methods כנ"ל:
|
|
שהרי, אנחנו יכולים להסתובב גם לאחור וגם לימין ע"י סיבוב שמאלה מספיק פעמים. (מזכיר קצת טקסים צה"ליים..)
בדוגמה השנייה, הדבר עוד יותר מתאים. במקום שנדרוש מהמממש לממש לנו הרבה פונקציות שבסה"כ קוראות לפונקציה אחת, נדרוש ממנו לממש רק את הפונקציה הארוכה:
|
|
ואת הגישה לשאר הפונקציות נעשה עם extension methods:
|
|
כך הרווחנו שני דברים:
למממש של המחלקה יש פחות עבודה לעשות, ואילו הממשק עדיין נוח למשתמשים בו.
כדאי לשים את הExtension Methods הנ"ל בNamespace של הממשק שלכם כדי שמי שמשתמש בממשק, ימצא את זה אוטומטית עם שימוש בממשק.
אחד הדברים שעשויים להציק לכם עכשיו, זה אם אתם לא חושבים שתמיד המימוש שלכם הוא המימוש הטוב. המימוש שלנו לTurnRight, מתבצע בעצם ע"י סיבוב שלוש פעמים שמאלה. ייתכן ומישהו מעוניין לממש את הסיבוב ימינה בצורה אחרת (למשל, להסתובב רק ימינה).
כדי לתמוך בזה, ניתן לעשות משהו כזה:
ניצור ממשק נוסף:
|
|
כעת נתחשב בממשק זה בExtension Method שכתבנו:
|
|
כך נתנו מצד אחד אפשרות לא לממש את הממשק, ולקבל מימוש דיפולטי, ומצד שני לממש את הממשק ולקבל את המימוש הרגיל.
המשך ערב ממומשק טוב