בהמשך לטיפ של אתמול,
נניח שיש לנו מחלקה כזאת שאחראית לבנות צורה:
|
|
כשהdelegate הוא מהסוג הזה ומוזרק מבחוץ (ככה החליט יוצר המחלקה)
|
|
וכתבנו כבר מתודה כזאת:
|
|
כעת אנחנו רוצים להשתמש בה בShapeBuilder.
עם זאת, נראה כי אנחנו לא יכולים להשתמש בה מאחר והdelegate מחזיר Shape, והמתודה שלנו מחזירה Circle.
לכן נראה שיש לנו שתי ברירות:
- ליצור עוד מתודה עם חתימה שמחזירה Shape שתקרא למתודה שלנו
- להחליף את החתימה של המתודה שלנו.
אם נחשוב על זה עוד קצת, הגיוני שדווקא כן נוכל להכניס את המתודה לShapeBuilder, כי Circle הוא Shape.
מסתבר שבC# 2.0 הכניסו לנו תמיכה בזה, ובאמת השורות הבאה תתקמפלנה לנו!
|
|
אם נחזור למושגים של אתמול, אומרים שהסבה של method group (יענו מתודה) לdelegate היא covariant בערך ההחזר.
כלומר אם יש לנו
|
|
וחתימה של delegate שמחזירה A, נוכל להכניס לdelegate כזה מתודה עם אותה חתימה שמחזירה B במקום.
עם זאת, אין covariance ברמת הטיפוסים של הdelegate, כלומר אם יש לנו את השני הdelegateים
|
|
לא מתקיים
|
|
נמחיש זאת באמצעות דוגמת קוד:
|
|
המשך יום קו-וואריאנטי טוב