פעמים רבות אנחנו מממשים ממשקים.
ניתן לממש ממשק בשתי דרכים: explicitly וimplicitly.
הדרך שאנחנו משתמשים בה בד”כ היא מימוש implicitly:
מה שזה אומר זה שפשוט במחלקה שלנו יש פונקציה עם חתימה שיש גם בממשק, למשל:
הממשק
|
|
עם המימוש
|
|
Explicit implementation:
כדי להסביר את זה ניתן דוגמה: נניח שהסיפור מסתבך, ויש לנו שני ממשקים שיש להם מתודה עם אותה חתימה:
|
|
עכשיו יש לנו טיפוס שמממש את שני הממשקים:
|
|
עדיין עובד, אבל אולי אנחנו רוצים משהו אחר, למשל לעשות שאם אנחנו משתמשים בIIsraeliProduct, יחזור לנו שם המוצר בעברית.
נוכל לעשות זאת באמצעות Explicit implementation: הרעיון הוא שאנחנו משייכים את המימוש לממשק, למשל:
|
|
כעת נוכל להשתמש במימוש שמעניין אותנו ע"י הכנסה לinstance מType מתאים:
|
|
נשים לב לכמה דברים מעניינים:
- אנחנו לא מציינים modifier (private/public וכו’) על המימוש. הסיבה היא שהמימוש הוא "מימוש פרטי", כלומר לא ניתן לגשת למימוש זה בלי להסב את הטיפוס לממשק שהמתודה שייכת לו
- לא נוכל לקרוא למימוש בלי הסבה לממשק הנתון
שימושים:
- יצירת שני מימושים שונים לשתי פונקציות עם אותה חתימה, בהתאם לinterface. בד"כ עדיף שכל המימושים הפרטיים יחזירו אותו ערך, אבל לפעמים זה יכול לעזור.
- הסתרת מתודה ממחלקה. לפעמים מכריחים אותנו לממש ממשק, אבל אנחנו לא מעוניינים שהמשתמש יוכל להשתמש בפונקציה של הממשק. כך אנחנו מסתירים לו אותה, ורק אם הוא יסב את המשתנה לטיפוס של הממשק, הוא יוכל לגשת אליה. נפוץ מאוד כאשר מממשים גם גרסה גנרית וגם גרסה לא גנרית של ממשק. בד"כ נסתיר את הגרסה הלא גנרית.
- מימוש שני ממשקים עם מתודה בעלת אותו שם וחתימה, עד כדי ערך החזר. לדוגמה, נניח שיש לנו את שני הממשקים הבאים:
|
|
אז לא נוכל לממש את שניהם, אלא נשתמש במימוש פרטי (מאחר ואי אפשר לעשות שתי מתודות עם אותו שם וחתימה עד כדי ערך החזר):
|
|
ראו גם טיפ 285 על איך Java מסתדרת בלי Explicit Implementation.
יום ממומשק טוב