שבט

איך לבדוק אם מתודה מומשה ע"י מחלקה יורשת

או בשפה קצת יותר מובנת – Checking if a Method is Overriden.

יש לא מעט פעמים שאנחנו יוצרים מחלקות בסיס עם מתודות וירטואליות, ומצפים שהמחלקות היורשות תממשנה את המתודות. למשל, יכול להיות מצב שאם המחלקה היורשת איננה מממשת את המתודות, אז הקוד שקורא לה לא יוכל לפעול כראוי. כיצד ניתן, בקוד שיוצר את האובייקט היורש, לדעת אם האובייקט הזה מימש מתודה מסויימת? דייווי בריון כתב פוסט עם מתודה קצרה ופשוטה, המשתמשת במתודה type.GetMethod כדי לקבל אינפורמציה על המתודהבה אנו מתעניינים. בשיטה שהוא מציע, הוא מקבל את האינפורמציה על המתודה המדוברת, ובודק אם ה-type של המחלקה היוצרת הוא ה-type של המחלקה היורשת ולא מחלקת הבסיס. פשוט וגאוני, לא?

גם בתגובות של הפוסט הזה שווה לעיין. אחת התגובות הטובות מציינת דרך נוספת לבצע את הבדיקה: קודם כל, בפרמטרים שמועברים ל-type.GetMethod אפשר גם להעביר דגל BindingFlags.DeclaredOnly האומר להחזיר רק מידע על מתודות שנוצרו במחלקה ולא מתודות שעברו בירושה. דבר נוסף שהוא ממליץ לבדוק הוא MethodAttributes.ReuseSlot, שלטענתו די מוודא שהמתודה הוגדרה כך:

override RETURN-Type MethodName(…)

כתבו תגובה

כתובת הדוא"ל שלכם לא תוצג.