אחד הדברים החזקים בתכנות מונחה עצמים הוא העובדה שאנחנו יכולים לרשת ממחלקה ולהרחיב אותה, למשל להוסיף עוד memberים עם לוגיקה משלנו.
עם זאת, יש מספיק מחלקות שהן sealed ולא נוכל לרשת מהן, ולכן לא נוכל להרחיב אותן.
למשל, יכול להיות שהיינו רוצים להוסיף למחלקה הידועה string מתודה שנקראת Reverse שהופכת את המחרוזת.
היינו רוצים לכתוב בעצם משהו כזה:
|
|
אבל אנחנו לא יכולים לשנות את הקוד של המחלקה string.
בנוסף, אנחנו גם לא יכולים לרשת מstring ולהוסיף שם את המתודה.
מה שאנחנו כן יכולים לעשות זה דבר כזה:
שימו לב שהמתודה Reverse לא ניגשת לMemberים פרטיים של string ולכן נוכל ליצור פונקציה סטטית ששקולה לה:
|
|
עם זאת קריאה כזאת היא פחות יפה:
|
|
או בצורה המלאה, כאשר אנחנו קוראים לפונקציה מחוץ למחלקה שבה היא נמצאת:
|
|
הסתרבלנו קצת.
פה באו עם אחד הדברים המהפכניים, ולדעתי הדבר הכי מהפכני בC# 3.0, מה שנקרא Extension methods.
הדבר מאפשר לנו לקרוא למתודה סטטית בצורה Postfix במקום Prefix. כלומר לעשות משהו כזה:
|
|
כדי לעשות את זה צריך לעשות את הדברים הבאים:
צריך להכניס את המתודה הסטטית שלנו למחלקה סטטית, למשל StringUtilities.
אחרי זה צריך להוסיף לפני הType של המשתנה שאנחנו רוצים לקרוא למתודה שלו בצורה Postfix את הkeyword ששמו this:
|
|
כעת נוכל לקרוא למתודה בצורה postfixית:
|
|
וגם בצורה prefixית:
|
|
מטורף, אה?
גם אם היו לנו מספר פרמטרים יכולנו ליצור Extension method, למשל:
|
|
נוכל לקרוא לה ע"י קריאה postfixית של המשתנה הראשון:
|
|
מגניב..
קצת מגבלות:
צריך כאמור שהמתודה תהיה בתוך מחלקה סטטית. בנוסף, אסור שמחלקה זו תהיה מחלקה פנימית של מחלקה אחרת.
בנוסף, אם יש לנו בnamespace שתי extension methods עם אותו שם, לא נוכל לקרוא בpostfix.
חוץ מזה, ניתן לכתוב extension methods רק לארגומנט הראשון שלהן, כלומר את הkeyword ששמו this נוכל לשים רק לפני המשתנה הראשון.
לבסוף, אם אנחנו רוצים להשתמש בextension method מnamespace אחר, נאלץ לעשות לו using.
בסה"כ extension methods זו דרך מאוד אלגנטית לבצע דברים שהיינו עושים עד היום במחלקות Utilities למיניהן.
שיהיה שבוע מורחב טוב