דוגמה לשימוש ב RTTI בפסקל מונחה עצמים

RTTI מייצג את Run Time Type Information. התפקיד שלו הוא לתת גישה למידע בכל מחלקה בצורה תכנותית בלי לדעת מראש לאן צריך לגשת. בפסקל המידע של RTTI נשמר ע"י VMT – אשר מייצג את Virtual Method Table, ומספק גישה לאיזור ה Published במחלקה ועוד.

אחד הדברים המדהימים שאפשר לעשות עם הRTTI הוא לקבל מידע על הרבה דברים שבצורה "רגילה" לא כל כך יהיה אפשרי, כמו הדוגמה הבאה:

Type
TMyEnum = (Enum1, Enum2, Enum3);

עכשיו נגיד ונרצה לרוץ על כל ערך מניה, ולתת פלט כזה:

Enum1 = 0
Enum2 = 1
Enum3 = 2

בצורה רגילה לא נוכל לעשות את זה, אך בעזרת RTTI, נוכל לממש את זה ממש כמו בשפה דינאמית.

תוכנית כזו תראה כך:

program EnumTest;
{$MODE OBJFPC}
uses TypInfo;

type TMyEnum = (Enum1, Enum2, Enum3);

var i : TMyEnum;

begin
for i := Low(TMyEnum) to High(TMyEnum) do
writeln(GetEnumName(TypeInfo(TMyEnum), ord(i)), ' = ', ord(i));
end.

וזהו יש לנו תוכנית שעושה בדיוק את זה.

התוכנית מאוד פשוטה, אנחנו מגדירים יחידה בשם TypInfo אשר מכילה את כלי ה RTTI שאנחנו צריכים. אח"כ אנחנו מגדירים את המניה שאנחנו רוצים ויוצרים לה משתנה שעליו נרוץ (ו).

לאחר מכן, אנחנו יוצרים לולאה לאורך כל המנייה (שימו לב שאם נשנה את גודל המניה, עדיין לא נהיה צריכים לשנות שום דבר אחר בקוד). בתוך הלולאה, אנחנו מדפיסים את המידע שלנו.

עכשיו את שם המנייה עצמה (Enum1 למשל) אנחנו לא יכולים לקבל, אז אנחנו נשתמש בפונקציה GetEnumName.

בעזרת TypeInfo אנחנו מקבלים המרה למצביע מסוג PTypeInfo אשר מכיל את המידע שGetEnumName זקוקה לו, ובעזרת הפונקציה ord אנחנו מחזירים את הערך המספרי של המיקום של המניה שלנו

בצד השני אחרי ה "=", אנחנו מדפיסים את המיקום של המניה שלנו (0, 1, 2).

שימו לב שאת הערך המספרי של המניה שלנו ניתן לקבל באמצעות ה RTTI עם הפונקציה GetEnumValue. הסיבה לקיום הפונקציה היא שבמידה ונשנה את המספרים של המניה כלומר במקום ש Enum3 יהיה 2, נציב לו 3, Ord עדיין יחזיר לנו 2 (כי הוא מחזיר את המיקום של האיבר) ולא 3, ואז כדאי להשתמש בקבל הערך חזרה מהמניה.

6 מחשבות על “דוגמה לשימוש ב RTTI בפסקל מונחה עצמים

  1. elcuco

    אני זוכר שהערות שמתחילות בדולר הן בעצם הוראות לקומפילר – אתה יכול להסביר מה ההוראה הזאת שאתה נתת?

    כמו כן, שלומיל כבר הסביר שהמושג הזה קיים ב־c++ (הוא מרגיש יותר מלכולך מאשר בפסקל אבל יעיל באותה מידה), ואם אתה משתמש ב־Qt4 למשל, חלק גדול מהדברים הללו זמינים לך גם בלי RTTI עבור מחלקות שיורשות את QObject.

    בינינו, לא תמיד משתמשים בדברים הללו וזה כמעט מיותר 🙂

  2. ik_5 מאת

    הפקודת מהדר שנתתי אומרת שאני אדבר בדיאלקט שנקרא Object FPC, שזה מדבר על תמיכה בתכנות מונחה עצמים לפי איך ש FPC חושב שצריך לדבר (ולדעתי הם הרבה יותר קרובים למקור מאשר דלפי, אם כי הם כמעט לגמרי זהים)

    השמוש העיקרי של RTTI בפסקל היא בלזרוס ושאר העורכים הגרפיים.
    אתמול במקרה הייתי צריך את זה (במקום לכתוב עוד קוד), אז כבר החלטתי לכתוב על זה טיפ 🙂

    הבעיה היחידה שאני רואה עם QT, זה ++C 😉

  3. פינגבק: ההבדל בין מחלקה לאובייקט « לראות שונה

  4. פינגבק: הרצת מתודות בצורה דינאמית חלק ראשון | לראות שונה

להשאיר תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s