23-09-12, 05:09 PM
(آخر تعديل لهذه المشاركة : 25-09-12, 11:54 AM {2} بواسطة الجوزاء وال.)
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
نبدا من حيث انتهينا من الفصل السابق
يجب قراءة الفصل السابق لتتمكن من الاستمرار في هذا الفصل
الفصل 11
وهذا الفصل ايضا كتب بقلم الاستاذ احمد نجم
السلام عليكم ورحمة الله وبركاته
نبدا من حيث انتهينا من الفصل السابق
يجب قراءة الفصل السابق لتتمكن من الاستمرار في هذا الفصل
الفصل 11
وهذا الفصل ايضا كتب بقلم الاستاذ احمد نجم
وراثة الواجهاتInterface Inheritance
تحدثنا سالفاً عن اشتقاق او وراثة فئة من أخرى وفيها تورث الفئة المشتقة كافة خصائص ووسائل وأحداث الفئة الأب وكذلك أيضاً وراثة الكود المكتوب بالداخل كاملاً. يُمكنك Visual Basic .NET من تعريف أو التصريح عن الواجهات ، والواجهة ما هي إلا واجهة لفئة ما واسمها خير دليل على هذا وهي لا تحتوي على أية أكواد للتنفيذ. بعد تصريحك عن واجهة جديدة يمكنك استخدام الكلمة [FONT=&]Implements[/FONT][FONT=&]<InterfaceName>[/FONT] وذلك كي تشتق أو تستدعي كافة الوسائل والخصائص والأحداث التي تم التصريح عنها داخل الواجهة.
كي تتضح لديك الرؤية أكثر من ذلك ، اتبع ما يلي ... قم بالتصريح عن هذين المتغيرين كما هو موضح أدناه :
كود :
[align=left]Dim CN1 As New System.Data.OleDb.OleDbConnection
[/align]
العجيب في هذين التصريحين أنك إذا نظرت في الوسائل والخصائص المصاحبة للكائن [FONT=&]CN1[/FONT] ستجدها بنفس الترتيب ونفس الهجاء بالنسبة للكائن [FONT=&]CN2[/FONT] ، ولكن مع اختلاف الوظيفة ... يعني مثلا الوظيفة [FONT=&]Open[/FONT] فهي مصاحبة لكلا الكائنين ولكنها مع [FONT=&]CN1[/FONT] تتصل بأي قاعدة بيانات حسب جملة الاتصال الممررة إليها [FONT=&]Connection[/FONT][FONT=&]String[/FONT] ، أما مع الكائن [FONT=&]CN2[/FONT] فهي لا تتعامل إلا مع محركات قواعد بيانات [FONT=&]MS[/FONT][FONT=&]SQL[/FONT][FONT=&]Server[/FONT] فقط بالرغم من أن اسم الوظيفة واحد في كلا الكائنين ... هنا يتضح معنى الواجهات.
سأوضح لك مرة أخرى وبمثال آخر .. بفرض أنك مدير مشروع برمجي معين وليكن هذا المشروع خاص بصناعة مكتبة DLL للتعامل مع ملفات MS OFFICE ، وقد قررت كمدير مشروع أن تقوم بعمل أربعة فئات [FONT=&]4[/FONT][FONT=&]Classes[/FONT] ، الأولى منهم لـ MS Word والثانية لـ MS Access والثالثة لـ MS PowerPoint والرابعة لـ MS Excel ، وتم الاتفاق على عدة وظائف مثلا كالآتي :
- [FONT=&]Method [/FONT][FONT=&]>> [/FONT][FONT=&]OpenFile[/FONT]
- [FONT=&]Method [/FONT][FONT=&]>> [/FONT][FONT=&]DeleteFile[/FONT]
- [FONT=&]Property >> FileName[/FONT]
- [FONT=&]Method [/FONT][FONT=&]>> FileSize[/FONT]
وهذا فقط كان على سبيل المثال .. تعال معي نرجع سوياً إلى موضوعنا الأساسي ، أنت كمدير مشروع كما ذكرنا سالفا أنك تريد تواجد هذه الخصائص والوسائل في كل فئة من الأربعة فئات المرجو إنشائها. هل الحل أنك تقوم بالنسخ واللصق ومن ثم تغيير الأكواد ، أم الإملاء على المطورين ومن ثم تجد الأخطاء ؟؟؟ ... هنا سنلجأ إلى استخدام الواجهات فهي من ستحل الموضوع.
من القائمة Project اختر العنصر Add Component ثم اختر العنصر Interface كما هو موضح بالصورة أدناه :
قد قمت بالتصريح عن الوسائل والخصائص السالف ذكرها في الواجهة كما يلي ... ولا زلت أكرر أننا لا نكتب أية أكواد داخل الواجهة ، فقط نقوم بالتعريف والتصريح عن مكونات الفئة كما يلي :
كود :
[align=left]Public Interface MyInterface
'This subroutine to open the file by using [FileName] property value
Sub OpenFile()
'Use this property to specify file path or read the file path to open it or delete it
Property FileName() As String
'This subroutine to delete the file by using [FileName] property value
Sub DeleteFile()
'This function used to return the file size by using [FileName] property value
Function FileSize() As Double
End Interface[b][FONT=Tahoma]
[/FONT][/b][/align]
أنا فقط قمت بعمل مثال عابر ومبسط ، فيمكنك عزيزي القارئ أن تقوم بالتصريح عما تحب وكيف تحب ومتي تحب ... قم بالتصريح مثلا عن متغيرات عادية وأحداث ووسائل وخصائص ، أما أن لضيق الوقت أردت إيصال الفكرة فقط. أنا متشوق بالفعل حتى أريك كيف يتم وراثة هذه الواجهة داخل الفئات التي قمنا بإنشائها سابقاً ، فكل ما عليك إلا الدخول داخل كل فئة وتكتب هذه العبارة :
كود :
[align=left]Implements MyInterface[b][FONT=Tahoma]
[/FONT][/b][/align]
ستجد نفسك في الفئة مثلا الخاصة بالـ MS Excel قد حصلت على النتيجة التالية كوراثة حقيقية لما تم التصريح عنه في الواجهة [FONT=&]MyInterface[/FONT]:
كود :
[align=left]Public Class Excel
Implements MyInterface
Public Sub DeleteFile() Implements MyInterface.DeleteFile
End Sub
Public Property FileName() As String Implements MyInterface.FileName
Get
End Get
Set(ByVal value As String)
End Set
End Property
Public Function FileSize() As Double Implements MyInterface.FileSize
End Function
Public Sub OpenFile() Implements MyInterface.OpenFile
End Sub
End Class
[/align]
هذه هي بالفعل شكل الفئة بعد وراثة الواجهة وما عليك إلا توزيع الهيكل العام لهذه المكتبة DLL على المطورين في المشروع وهم يقوموا بكتابة الكود فقط داخل الوسائل والخصائص والأحداث المصرح عنها ... يمكنك تحميل المشروع من الرابط التالي :
http://www.4shared.com/rar/8gCjzUtj/21250864124.html
أو من المرفقات بإسم : مرفق 1
** ملحوظة **
كما ذكرنا سابقاً أن Visual Basic .NET لا يسمح لك بالوراثة من أكثر من فئة ، ولكن داخل الفئة الواحدة يمكنك وراثة أكثر من واجهة.
كلمة أخيرة في مبدأ الوراثة .. الكلمات المفتاحية
[FONT=&]Access Modifiers[/FONT]
- [FONT=&]Public[/FONT]: يجعل المتغير أو الوسيلة معرفة على مستوى الفئة ككل وكذلك على مستوى المشروع بالكامل ، كما يمكنك الحصول على هذا المتغير أو هذه الوسيلة إذا قمت بأخذ نسخة Instance من الفئة في أي مكان آخر على اختلاف نوع المشاريع سواء ******sApplications أو ClassLibrary ... الخ. كما أن هذا المتغير أو الوسية من النوع [FONT=&]Public[/FONT] تظهر في حالات الوارثة في الفئات المشتقة.
- [FONT=&]Friend[/FONT]: يجعل الإجراء معرف على مستوى الفئة ككل وداخل المشروع الحالي بصفة عامة ، لكن اذا تم دمج الفئة في ملف DLL وأخذ نسخة لكائن من الفئة فإن الاجراءات من هذا النوع لا تظهر.
- [FONT=&]Default[/FONT]: وهنا نحن بصدد الحديث عن عدم استخدام الكلمات المفتاحية والتي يعتبرها المترجم من أنها من النوع [FONT=&]Public[/FONT] وينطبق عليها ما ورد سابقاً.
- [FONT=&]Private[/FONT]: يجعل الإجراء معرف على مستوى على الفئة فقط ، ولا يظهر في أي مكان خارجها.
- [FONT=&]Protected[/FONT]: يشبه الـ [FONT=&]Private[/FONT] تماماً ولكن يختلف عنه في نقطة ، ألا وهي أنه في حالة التوريث فإن الفئة المشتقة [FONT=&]Derived[/FONT][FONT=&]Class[/FONT] يظهر بداخله الإجراءات والمتغيرات من النوع [FONT=&]Protected[/FONT] ، ولكن إذا أخذت نسخة من الفئة الأب [FONT=&]****[/FONT][FONT=&]Class[/FONT] أو ما يسمى بالـ [FONT=&]Parent[/FONT][FONT=&]Class[/FONT] فلن تظهر المتغيرات ولا الإجراءات من النوع [FONT=&]Protected[/FONT].
يمكنك مراجعة المثال التالي ، فهو عبارة عن فئة بالاسم ( MyClass ) وبها بعض الإجراءات باختلاف الكلمات المفتاحية لكل منها:
http://www.4shared.com/rar/pmYpsxLx/31250864124.html
أو من المرفقات بإسم : مرفق 2