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

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

אז כמובן שבשפות דינאמיות אפשר להרחיב בזמן ריצה את המחלקה. אבל בפסקל החל מדלפי 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) בעוד שדלפי כן.

רשומה זו פורסמה בקטגוריה Delphi, FPC, Object Pascal, פיתוח, קוד פתוח, תכנות. אפשר להגיע ישירות לרשומה זו עם קישור ישיר.

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

  1. מאת משה

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

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

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

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

להגיב

Fill in your details below or click an icon to log in:

WordPress.com Logo

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

Twitter picture

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

Facebook photo

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

Connecting to %s