מכירים את זה שיש לכם מחלקה ואתם צריכים לספק לה עוד כמה יכולות, בהתאם לשימוש שלכם בה, אבל אתם הרי לא יכולים, אז אתם יורשים ממנה ואז מוסיפים למחלקה את מה שרציתם ?
אז כמובן שבשפות דינאמיות אפשר להרחיב בזמן ריצה את המחלקה. אבל בפסקל החל מדלפי 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) בעוד שדלפי כן.
שפות התכנות המודרניות, ובייחוד סי-שארפ ודלפי (שיש להן הורה משותף) שואבות את ההשראה מאותן היכולות. למשל, מה שתיארת מוכר בסי שארפ כך:
http://en.wikipedia.org/wiki/Extension_method
בזמן פיתוח ל web, יש המון יתרונות ביכולת הזו, וזה אחד הדברים שאני אוהב בסי-שארפ ולכן תומך בפרויקט מונו (על אף חסרונותיו הרבים).
פינגבאק: FPC 2.6.0 שוחררה | לראות שונה
פינגבאק: מערך כתכונה | לראות שונה