בהמשך לשבוע הטיפוסי,
ראינו שאנחנו מסוגלים לקבל Type באמצעות הKeyword ששמו typeof.
בנוסף, קיימת אפשרות לקבל את הType של instance של אובייקט נתון, באמצעות המתודה GetType. מתודה זו היא של object.
למשל:
|
|
בשונה מהKeyword ששמו typeof, הפונקציה GetType נקראת בזמן ריצה וכך הטיפוס מפוענח בזמן ריצה לפי הטיפוס של הinstance.
קיימת עוד פונקציה ששמה GetType המאפשרת לנו לקבל Type לפי הFullName שלו (זוכרים מאתמול?):
|
|
היא מחפשת את הType שאנחנו מחפשים מהAssemblyים (הDLLים) הטעונים לנו בזכרון.
אחד השימושים הלא נכונים שראיתי של הפונקציה GetType הוא להשתמש בו בכדי לבדוק מה הסוג שלthis, ולפיו לבצע פעולה, כלומר משהו כזה:
|
|
הדבר הזה לא נכון, מאחר ומחלקה לא אמורה להכיר את המחלקות בת שלה. (אחד העקרונות של OOP)
הפתרון הנכון הוא להפוך את Draw לפונקציה וירטואלית:
|
|
ולדרוס אותה במחלקות בת:
|
|
עוד שימוש לא נכון בGetType הוא להשתמש בו בכדי לוודא שאובייקט הוא מסוג טיפוס ידוע, בשביל לעשות הסבה בטוחה.
כלומר לעשות משהו כזה:
|
|
מה הבעיה בקטע קוד הזה?
יכול להיות שinstance הוא טיפוס שיורש מShape (למשל Circle), ואז לא נכנס לתנאי (כי GetType יחזיר typeof(Circle) ולא typeof(Shape)), ולכן לא תתבצע ההסבה.
הדרך הנכונה היא להשתמש בKeywordים ששמם is או as:
|
|
כזכור, is בודק שמופע של אובייקט הוא מטיפוס נתון או יורש ממנו, ומאחר וCircle יורש מShape, התנאי מתקיים.
לחלופין אפשר להשתמש בas:
|
|
ראו גם טיפ מספר 12.
(שימו לב שגם שילוב של שני האנטי-טיפים הוא לא נכון, כלומר לכתוב if (this is Sparta) זו לא כתיבה נכונה, בדומה לGetType)
המשך שבוע טיפוסי טוב