הרחבת מחלקות בזמן ריצה

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

אז כמובן שבשפות דינאמיות אפשר להרחיב בזמן ריצה את המחלקה. אבל בפסקל החל מדלפי 8, ומגרסת הפיתוח 2.5.1 של FPC יש תמיכה גם בהרחבת המחלקה בזמן ריצה.

המימוש של FPC נכון לכתיבת הפוסט הזה, עדיין לא הושלם במלואו (אתם יכולים למצוא אותו בכלל בעץ משל עצמו כרגע), ועדיין לא מתקרב להיות יציב, אבל התחביר שאנחנו זקוקים לו נקרא class helpers.

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

אחד היתרונות בהרחבה שכזו, היא היכולת להרחיב גם מחלקות ש"נאטמו" (sealed class), כך שבכל זאת הם יוכלו לקבל הרחבה כלשהי.

אז כיצד התחביר של class helpers נראה ?

type
  TObjectHelper = class helper for TObject
    function TheAnswer: Integer;
  end;

function TObjectHelper.TheAnswer: Integer;
begin
  Result := 42;
end;

begin
  o := TObject.Create;
  o.TheAnswer;
end.

הקוד מאוד פשוט. נוצרה מחלקה המרחיבה את TObject שזו המחלקה הבסיסית ביותר של פסקל מונחה עצמים. ההרחבה מספקת למחלקה עוד מתודה (פונקציה) בשם TheAnswer אשר מחזירה את הערך 42, וכאשר השתמשנו ב TObject לאחר שהוכרזה ההרחבה, בעצם יש לנו עכשיו את TheAnswer כחלק מאותה מחלקה שהורחבה.

ניתן בנוסף גם לרשת מhelper אחר, ולהמשיך אותו על ידי שימוש בתחביר הבא:

type
  TObjectHelper2 = class helper(TObjectHelper) for TObject
  public
    property LifeUniverseAndEverything : integer read TheAnswer;
  end;

הקוד הזה מוסיף תמיכה לתכונה בשם LifeUniverseAndEverything אשר מחזירה את התשובה של TheAnswer אחרי שהרחבנו מTObjectHelper.

נכון לכתיבת פוסט זה, FPC לא תומך עדיין בהרחבת רשומה (record) בעוד שדלפי כן.

3 מחשבות על “הרחבת מחלקות בזמן ריצה

  1. משה

    שפות התכנות המודרניות, ובייחוד סי-שארפ ודלפי (שיש להן הורה משותף) שואבות את ההשראה מאותן היכולות. למשל, מה שתיארת מוכר בסי שארפ כך:
    http://en.wikipedia.org/wiki/Extension_method

    בזמן פיתוח ל web, יש המון יתרונות ביכולת הזו, וזה אחד הדברים שאני אוהב בסי-שארפ ולכן תומך בפרויקט מונו (על אף חסרונותיו הרבים).

  2. פינגבק: FPC 2.6.0 שוחררה | לראות שונה

  3. פינגבק: מערך כתכונה | לראות שונה

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s