בתוך דלפי, "ממשק" יש שתי משמעויות ברורות. בתוך OOP ז'רגון, אתה יכול לחשוב על ממשק ככיתה ללא יישום. בקטע ממשק הגדרת היחידות של דלפי משמש להכריז על כל חלקי קוד ציבוריים המופיעים ביחידה. מאמר זה יסביר ממשקים מנקודת מבט של OOP.
אם אתה עומד ליצור יישום סולידי באופן שהקוד שלך ניתן לתחזוקה, לשימוש חוזר וגמיש OOP טבע דלפי יעזור לך לנסוע ב 70% הראשונים של המסלול שלך. הגדרת הממשקים והטמעתם תעזור עם 30% הנותרים.
שיעורים מופשטים
אתה יכול לחשוב על ממשק ככיתה מופשטת עם כל היישום שהופשט וכל מה שאינו ציבורי הוסר. שיעור מופשט ב דלפי היא כיתה שלא ניתנת ליישום - אינך יכול ליצור אובייקט מכיתה המסומנת כמופשטת.
בואו נסתכל על הצהרת ממשק דוגמא:
סוג
IConfigChanged = ממשק['{0D57624C-CDDE-458B-A36C-436AE465B477}']
תהליך ApplyConfigChange;
סוף;
ה IConfigChanged הוא ממשק. ממשק מוגדר כמו מחלקה, מילת המפתח "ממשק" משמשת במקום "מחלקה". הערך המדריך העוקב אחר מילת המפתח לממשק משמש את המהדר כדי לזהות את הממשק באופן ייחודי. כדי ליצור ערך GUID חדש, פשוט לחץ על Ctrl + Shift + G ב- Delphi IDE. כל ממשק שתגדיר זקוק לערך Guid ייחודי.
ממשק ב- OOP מגדיר הפשטה - תבנית למחלקה בפועל שתיישם את הממשק - שתיישם את השיטות שהוגדרו על ידי הממשק. ממשק לא עושה כלום, יש לו רק חתימה לאינטראקציה עם שיעורים או ממשקים אחרים (מיישמים).
יישום השיטות (פונקציות, נהלים ושיטות קבל / קביעת רכוש) נעשה בכיתה המיישמת את הממשק. בהגדרת הממשק, אין קטעי היקף (פרטיים, ציבוריים, מפורסמים וכו ') הכל ציבורי. סוג ממשק יכול להגדיר פונקציות, נהלים (שיהפכו בסופו של דבר לשיטות מהמחלקה שמיישמת את הממשק) ותכונות. כאשר ממשק מגדיר מאפיין עליו להגדיר את שיטות ה- get / set - ממשקים אינם יכולים להגדיר משתנים.
כמו בשיעורים, ממשק יכול לרשת ממשקים אחרים.
סוג
IConfigChangedMore = ממשק(IConfigChanged)
תהליך ApplyMoreChanges;
סוף;
תכנות
רוב מפתחי דלפי כאשר הם חושבים על ממשקים הם חושבים על תכנות COM. עם זאת, ממשקים הם רק מאפיין OOP של השפה - הם לא קשורים ל- COM באופן ספציפי. ממשקים ניתן להגדיר וליישם ביישום Delphi מבלי לגעת בכלל ב- COM.
יישום
כדי ליישם ממשק עליכם להוסיף את שם הממשק להצהרת הכיתות, כמו ב:
סוג
TMainForm = מעמד(TForm, IConfigChanged)
ציבורי
תהליך ApplyConfigChange;
סוף;
בקוד לעיל טופס דלפי בשם "MainForm" מיישם את הממשק IConfigChanged.
אזהרה: כאשר מחלקה מיישמת ממשק עליו ליישם את כל השיטות והמאפיינים שלו. אם אינכם מצליחים / שוכחים ליישם שיטה (לדוגמה: ApplyConfigChange) שגיאת זמן קומפילציה "E2003 מזהה לא מוצהר: 'ApplyConfigChange'" יקרה.
אזהרה: אם תנסה לציין את הממשק ללא ערך GUID שתקבל: "E2086 סוג 'IConfigChanged' עדיין לא מוגדר לחלוטין".
דוגמא
שקול יישום MDI בו ניתן להציג מספר טפסים למשתמש בפעם אחת. כאשר המשתמש משנה את תצורת היישום, רוב הטפסים צריכים לעדכן את התצוגה שלהם - להציג / להסתיר כמה כפתורים, לעדכן כותרות תווית וכו '. תזדקק לדרך פשוטה להודיע לכל הטפסים הפתוחים שקרה שינוי בתצורת היישום. הכלי האידיאלי לתפקיד היה ממשק.
כל טופס שצריך לעדכן כאשר שינויי התצורה יבצעו את IConfigChanged. מכיוון שמסך התצורה מוצג באופן מודאלי, כאשר הוא סוגר את הקוד הבא מבטיח כי כל טופסי היישום IConfigChanged מקבלים הודעה ויישום ApplicationConfigChange נקרא:
תהליך DoConfigChange ();
var
cnt: מספר שלם;
icc: IConfigChanged;
התחל
ל cnt: = 0 ל -1 + מסך. FormCount לעשות
התחל
אם תומך (מסך. טפסים [cnt], IConfigChanged, icc) לאחר מכן
icc. ApplyConfigChange;
סוף;
סוף;
התומכים פונקציה (מוגדר ב- Sysutils.pas) מציין אם אובייקט או ממשק נתון תומכים בממשק שצוין. הקוד עובר דרך המסך. אוסף טפסים (של אובייקט ה- TScreen) - כל הטפסים המוצגים כעת ביישום. אם טופס מסך. טפסים [cnt] תומך בממשק, תומך מחזיר את הממשק לפרמטר הפרמטר האחרון ומחזיר אמת.
לכן, אם הטופס מיישם את IConfigChanged, ניתן להשתמש במשתנה icc בכדי לקרוא לשיטות הממשק כפי שיישמו על ידי הטופס. שימו לב כמובן שכל צורה יכולה להיות יישום שונה משלו של נוהל ApplyConfigChange.
אבות
כל כיתה שתגדיר בדלפי צריכה להיות אב קדמון. נושא זה הוא האב הקדמון האולטימטיבי לכל החפצים והמרכיבים. הרעיון לעיל חל גם על ממשקים, ה- IInterface הוא מחלקת הבסיס של כל הממשקים. IInterface מגדיר 3 שיטות: QueryInterface, _AddRef ו- _Release.
המשמעות היא של- IConfigChanged שלנו יש גם את שלוש השיטות, אך לא יישמנו את אלה. הסיבה לכך היא ש- TForm יורש מ- TComponent שכבר מיישם את ה- IInterface עבורך! כאשר ברצונך ליישם ממשק בכיתה שירושה מ- TObject, ודא שהכיתה שלך יורשת מ- TInterfacedObject במקום. מכיוון TInterfacedObject הוא יישום TOnject ליישום IInterface. לדוגמה:
TMyClass = מעמד(TInterfacedObject, IConfigChanged)
תהליך ApplyConfigChange;
סוף;
לסיכום, IUnknown = IInterface. IUnknown מיועד ל- COM.