أفترض بمن يتابع معي أن تكون له دراية عن الفئات وإنشائها والتعامل معها
الواجهة هي نوع مرجعي تستخدمه الأنواع الأخرى لضمان أنها تدعم عملية معينة وهي تحدد عناصر معينة يجب أن تتضمنها الفئات التي تحقق هذه الواجهات وهي تحتوي على طرائق وخصائص وعناصر أحداث تماما كالفئات
الصيغة العامة
[ <attributelist> ] [ accessmodifier ] [ Shadows ] _ Interface name [ ( Of typelist ) ] [ Inherits interfacenames ] [ [ modifiers ] Property membername ] [ [ modifiers ] Function membername ] [ [ modifiers ] Sub membername ] [ [ modifiers ] Event membername ] [ [ modifiers ] Interface membername ]فئة [ [ modifiers ] Class membername ] [ [ modifiers ] Structure membername ] End Interface
وكما نرى من الصيغة العامة فيسبق التصريح عن الواجهة واصفات Attributes وكلمات تحديد المجال مثل Public أو الكلمة Shadows التي تعني أن هذه الواجهة تعيد تعريف واجهة موجودة وبنفس الاسم كما يمكن وراثة واجهة من أخرى تماما كالفئات وهي تحتوي على نفس العناصر الممكن احتوائها ضمن الفئات من وظائف ودالات وخصائص ... الخ ولكنها تحدد تعريف هذه الوظائف والخصائص فقط بدون الكود الذي يحدد عملها ويجب على أي فئة تحقق واجهة معينة أن توفر الكود العملي لكافة العناصر الموجودة ضمن هذه الواجهة ويمكن تعريف الواجهة على مستوى Namespace أو Module أي يجب أن يكون تعريفها عاما وغير محصور ضمن إجراء معين كما يمكننا تعشيش الواجهات بحيث أن أية واجهة ممكن أن تتضمن واجهة أخرى كما يمكن تحديد خاصية افتراضية باستخدام الكلمة Default ولا يمكن استخدام محددات الوصول مثل Public أو Private عند التصريح عن عناصر الواجهة ولكن يمكن استخدام Overloads أو Shadows وعندما تستخدم واجهة ضمن فئة يتم الإعلان عن عناصر هذه الفئة باستخدام محدد الوصول Public افتراضيا الأمر الذي يمكنك تغييره لاحقا على مستوى تلك الفئة كما لا يمكن التصريح عن متغيرات ضمن الواجهة وعند تسمية الواجهات يفضل أن يبدأ الاسم دوما بالحرف I
لنرى الآن بعض الأمثلة عن الواجهات
يمكن أن نعرف واجهة لأشخاص تحتوي على بعض الخصائص كما يلي
Interface IPerson Property Name() As String Property Birthdate() As Date ReadOnly Property Age() As Integer End Interface
أو يمكننا تعريف واجهة لبعض العمليات الحسابية
Interface ISomeMath Function AddNumbers(ByVal a As Integer, ByVal b As Integer) As Integer Function AddNumbers(ByVal a As Double, ByVal b As Double) As Double Function Multiply(ByVal a As Integer, ByVal b As Integer) As Double End Interface
كما يمكن أن نعرف واجهة لدفتر الهواتف ترث واجهة الأشخاص كما يلي
Interface IPhonebook Inherits IPerson Property Phone() As String Property Address() As String Sub ShowInformations() End Interface
الآن إن كانت لدينا فئة للهواتف نريد منها أن تحقق الواجهة Phonebook نستخدم الكلمة Implements تماما بعد التصريح عن تلك الفئة وسنرى أن بيئة التطوير ستضيف الهيكل الأساسي لعناصر تلك الواجهة إلى الفئة الجديدة
Public Class Phones Implements IPhonebook Public ReadOnly Property Age() As Integer Implements IPerson.Age Get End Get End Property ....... End Class
كما يمكن استخدام أكثر من واجهة ضمن الفئة الواحدة
Class SomeTest Implements IPerson Implements ISomeMath Public ReadOnly Property Age() As Integer Implements IPerson.Age Get End Get End Property ....... Public Function AddNumbers(ByVal a As Double, ByVal b As Double) As Double _ Implements ISomeMath.AddNumbers End Function ....... End Class
ويبقى عليك كتابة الكود المناسب لتلك العناصر بما يتناسب مع وظيفة الفئة التي تعمل عليها لاحظ تعريف جميع العناصر المضافة باستخدام محدد الوصول Public في هذه المرحلة
وهذا مثال على تعشيش الواجهات بداخل بعضها
Interface IPhonebook Interface IPersone Property Name() As String Property Birthdate() As Date ReadOnly Property Age() As Integer End Interface Property Phone() As String Property Address() As String Sub ShowInformations() Event SomeEvent(ByVal a As Int16) End Interface
واستخدامها ضمن الفئة
Class test Implements IPhonebook Implements IPhonebook.IPersone ....... End Class
