في دلفي"واجهة" لها معنيان متميزان. في OOP المصطلحات ، يمكنك أن تفكر في واجهة كصف بدون تنفيذ. في قسم واجهة تعريف وحدة دلفي يستخدم لإعلان أي أقسام عامة من الكود تظهر في الوحدة. تشرح هذه المقالة واجهات من منظور OOP.
إذا كنت على وشك إنشاء تطبيق صخري بطريقة يمكن صيانتها ، يمكن إعادة استخدامها ، ومرونة OOP سوف طبيعة دلفي تساعدك على قيادة 70 ٪ الأولى من مسارك. تحديد الواجهات وتنفيذها سيساعد في الحفاظ على الـ 30٪ المتبقية.
دروس مجردة
يمكنك أن تفكر في الواجهة كطبقة تجريدية مع إزالة جميع عمليات التنفيذ وإزالة كل شيء غير عام. فئة مجردة في دلفي هي فئة لا يمكن إنشاء مثيل لها - لا يمكنك إنشاء كائن من فئة تم تعليمها على أنها مجردة.
دعنا نلقي نظرة على مثال إعلان واجهة:
اكتب
IConfigChanged = واجهه المستخدم['{0D57624C-CDDE-458B-A36C-436AE465B477}']
إجراء ApplyConfigChange ؛
النهاية;
ال IConfigChanged هي واجهة. يتم تعريف الواجهة تمامًا مثل الفصل الدراسي ، يتم استخدام الكلمة الأساسية "واجهة" بدلاً من "الفئة". يتم استخدام قيمة Guid التي تلي الكلمة الأساسية للواجهة بواسطة المحول البرمجي لتعريف الواجهة بشكل فريد. لإنشاء قيمة GUID جديدة ، فقط اضغط على Ctrl + Shift + G في Delphi IDE. تحتاج كل واجهة تقوم بتعريفها إلى قيمة إرشادية فريدة.
تعرّف الواجهة في OOP فكرة تجريدية - قالب لفئة فعلية ستنفذ الواجهة - والتي ستنفذ الطرق التي تحددها الواجهة. لا تفعل الواجهة أي شيء فعليًا ، فهي تحتوي فقط على توقيع للتفاعل مع فئات أو واجهات (تطبيق) أخرى.
يتم تنفيذ الأساليب (الدالات والإجراءات والممتلكات Get / Set أساليب) في الفصل الذي ينفذ الواجهة. في تعريف الواجهة ، لا توجد أقسام نطاق (خاصة ، عامة ، منشورة ، إلخ.) كل شيء عام. يمكن أن يحدد نوع الواجهة الوظائف والإجراءات (التي ستصبح في النهاية أساليب للفئة التي تنفذ الواجهة) والخصائص. عندما تعرّف الواجهة خاصية ما ، يجب أن تحدد أساليب get / set - لا يمكن للواجهات أن تحدد المتغيرات.
كما هو الحال مع الفئات ، يمكن أن ترث الواجهة من واجهات أخرى.
اكتب
IConfigChangedMore = واجهه المستخدم(IConfigChanged)
إجراء تطبيقأكثر
النهاية;
برمجة
معظم مطوري دلفي عندما يفكرون في واجهات يفكرون في برمجة COM. ومع ذلك ، فإن الواجهات ليست سوى ميزة OOP للغة — فهي غير مرتبطة بـ COM على وجه التحديد. يمكن تعريف وتنفيذ الواجهات في تطبيق دلفي دون لمس COM على الإطلاق.
التنفيذ
لتنفيذ واجهة ، تحتاج إلى إضافة اسم الواجهة إلى عبارة الفصل ، كما في:
اكتب
TMainForm = صف دراسي(TForm ، IConfigChanged)
عامة
إجراء ApplyConfigChange ؛
النهاية;
في التعليمات البرمجية أعلاه نموذج دلفي المسمى "MainForm" بتنفيذ واجهة IConfigChanged.
تحذير: عندما ينفذ الفصل واجهة ، يجب أن يطبق جميع أساليبه وخصائصه. إذا فشلت / نسيت تطبيق طريقة (على سبيل المثال: ApplyConfigChange) خطأ وقت الترجمة "المعرف غير المعلن E2003:" ApplyConfigChange " سوف يحدث.
تحذير: إذا حاولت تحديد الواجهة بدون قيمة GUID ، فستتلقى: "لم يتم تعريف نوع E2086" IConfigChanged "بالكامل حتى الآن".
مثال
النظر في تطبيق MDI حيث يمكن عرض العديد من النماذج للمستخدم في وقت واحد. عندما يغير المستخدم تكوين التطبيق ، تحتاج معظم النماذج إلى تحديث عرضه — إظهار / إخفاء بعض الأزرار وتحديث التسميات التوضيحية للتسمية وما إلى ذلك. قد تحتاج إلى طريقة بسيطة لإعلام جميع النماذج المفتوحة بحدوث تغيير في تكوين التطبيق. كانت الأداة المثالية لهذه الوظيفة هي الواجهة.
كل نموذج يحتاج إلى تحديث عند تغيير التكوين سيتم تطبيق IConfigChanged. نظرًا لأن شاشة التهيئة معروضة بشكل مشروط ، عندما تغلق الكود التالي يضمن إخطار جميع نماذج تطبيق IConfigChanged وتُسمى ApplyConfigChange:
إجراء DoConfigChange () ؛
فار
cnt: عدد صحيح
icc: IConfigChanged؛
ابدأ
إلى عن على cnt: = 0 إلى -1 + الشاشة. FormCount فعل
ابدأ
إذا يدعم (الشاشة. النماذج [cnt] ، IConfigChanged ، icc) ثم
icc. ApplyConfigChange ؛
النهاية;
النهاية;
يدعم وظيفة (المعرفة في Sysutils.pas) يشير إلى ما إذا كان كائن أو واجهة معينة تدعم واجهة محددة. يتكرر الرمز من خلال الشاشة. مجموعة النماذج (لكائن TScreen) - جميع النماذج المعروضة حاليًا في التطبيق. إذا كان النموذج شاشة. النماذج [cnt] يدعم الواجهة ، ويعيد يدعم واجهة المعلمة المعلمة الأخيرة ويعود صحيح.
لذلك ، إذا قام النموذج بتطبيق IConfigChanged ، فيمكن استخدام متغير icc لاستدعاء أساليب الواجهة كما تم تنفيذها بواسطة النموذج. لاحظ ، بالطبع ، أن كل شكل يمكن أن يكون تطبيقه الخاص مختلفة من إجراء ApplyConfigChange.
أسلاف
أي فصل تحدده في دلفي يحتاج إلى سلف. TObject هو الجد النهائي لجميع الكائنات والمكونات. تنطبق الفكرة أعلاه على الواجهات أيضًا ، IInterface هي الفئة الأساسية لجميع الواجهات. يعرّف IInterface 3 طرق: QueryInterface و _AddRef و _Release.
هذا يعني أن IConfigChanged لديه أيضًا هذه الطرق الثلاثة ، لكننا لم نطبقها. وذلك لأن TForm يرث من TComponent الذي ينفذ IInterface بالفعل من أجلك! عندما تريد تطبيق واجهة في فئة ترث من TObject ، تأكد من أن فصلك يرث من TInterfacedObject بدلاً من ذلك. منذ TInterfacedObject هو TObject تطبيق IInterface. فمثلا:
TMyClass = صف دراسي(TInterfacedObject، IConfigChanged)
إجراء ApplyConfigChange ؛
النهاية;
في الختام ، IUnknown = IInterface. IUnknown هو لـ COM.