دورة الدوت نت
الدرس(10):مدخل الى الفئاتClasses - الجزء الأول
السلام عليكم ورحمة الله وبركاته
بسم الله الرحمن الرحيم
عندما نتحدث عن الفيجوال بيسك دوت نت فاننا
نتحدث عن لغة كائنية(غرضية) التوجه...
كتوضيح: العالم من حولنا مليء بالكائنات وكل كائن
له خصائصه وسماته وهذا ما يتم تطبيقه في لغة البرمجة كائنية التوجه حيث يتم اعتبار
مساحة العمل كالعالم فتكون الكائنات وتحدد خصائصها وسماتها وتستخدم ظواهرها في عملك..
الآن سنتطرق الى أهم مواضيع البرمجة كائنية التوجه
OOP وهو موضوع
الفئات Classes..
الفئة(Class):
عبارة عن قالب يمكنك بواستطه تشكيل الكائنات التي حددت صفاتها ومن ثم استخدمها..كتشبيه
يمكن اعتبارها كقالب الأحذية -أعزكم الله- التي يمكنك بواستطها انشاء حذاء بمواصفات
هذا القالب.
يتم انشاء Class
باستخدام الكلمة المحجوزة Class
وتنهيه بالعبارة المشهورة End Class
مثال:
كود:
Class Class****
End Class
كما أسلفنا فان الفئة عبارة عن كائن له
خصائصه وظواهره لذلك فان الكلاس يحتوي على أعضاء وظواهر تصفه حركاته
لنأخذ مثال:
كود:
Class Person
Public **** As String
Public Age As Integer
Public Weight As Double
End Class
الآن كما ترى فاننا قمنا ببناء فئة جديدة أسميناها
Person وأضفنا
لها خصائص الاسم والعمر والوزن
ولكي تستطيع الوصول الى عناصر الفئة فانظر المثال
التالي:
كود:
Dim x As New Person
x.**** = "Lo2i"
x.Age = 20
x.Weight = 70
MsgBox("**** is " & x.**** & vbCrLf
& "Age: " & Str(x.Age) & vbCrLf & "Weight:
" & Str(x.Weight))
كما ترى فاننا قمنا بالاعلان عن متغير جديد
من نوع الفئة التي صغنا معالمها وأسندنا لعناصرها قيم جديدة وبعدها استعلمنا عن القيم
التي تحملها عناصرها
والنتيجة:

لعلك انتبهت إلى أن الفئة بتركيبتها البرمجية
تشبه كثيرا تركيبة Structure فيمكن صنع فئة من تركيبة Structure
باستبدال كلمة Structure
بكلمة Class
راجع: الدرس(4): التركيبات أنواعها واستخداماتها
لكن هناك شيء من الاختلاف بين الفئة والتركيبة
Structue
1)
الفئة من النوع المرجعي بينما التركيبة Structure من النوع
ذات القيمة
راجع: الدرس(9): الدوال والاجراءات
2)
الفئة يمكن أن لا تحتوي على أعضاء بينما التركيبة
تصدر رسالة خطأ عند خلوها من العناصر
كود:
Class empty
No Problems
End Class
كود:
Structure empty
'Error ****:
Error Structure 'empty must contain at least one instance member variable or
Event declaration
End Structure
أي ان التركيبة empty يجب أن تحتوي على عضو ابتدائي متغير أو اجراء
3)
المحدد الافتراضي للفئة هو Private
بينما المحدد الافتراضي لتركيبة
الStructure هو Public
4)
يمكننا تطبيق مبدأ الورائة والاشتقاق
على الفئات
بينما التركيبات فلا
___________________________
ملاحظة: يمكن للفئة أن تكون متداخلة Nested
مثال:
كود:
Class
Person
Class
****
Public First As
String
Public Last As
String
End Class
Public Age As Integer
End Class
___________________________
ملاحظة أخرى:بامكاننا استخدام الفئة كوسيط نرسله للاجراءات والدوال بالطريقتين
التي ذكرناها (الارسال بالمرجع أو بالقيمة) وبالرغم من انك ارسلته بالقيمة فان الجراء
الحاضن سيغير قيمة المرسل بالرغم من ان ارسال الوسيط تم بالقيمة وهذا يتطابق مع الفرق
الذي ذكرناه بالاعلى أن الفئة من النوع المرجعي...
كل ما سبق نظرة مبسطة جدا عن
الفئات...
الآن تحدثنا أن الفئة تمثل كائن
والكائن له أعضاء إذن الفئة لها أعضاء ويمكن تقسيمها لاربعة مكونات:
الحقول(Fields)
الطرق(Methods)
الخصائص(properties)
الأحداث(Events)
نبدأ بالحقول:
الحقول Fields
تعتبر الحقول أصغر وأبسط مكونات
الفئة وما هي الا متغيرات عادية.
مثال:
كود:
Class Person
Dim **** As String 'Field
Dim Age As Integer 'Field
...
...
...
End Class
كما نرى فان هذه الفئة تحتوى
على فئتين أو أكثر وهما **** و Age
أيضا من مجمل الفروق بين الفئة
والتركيبة Structure فان حقول الفئة يكمن اسناد قيم لها وقت كتابة الفئة بخلاف التركيبة Structure
توضيح:
كود:
Class Person
Dim **** As String =
"Mr_MOHAMMED" 'No Problem
Dim Age As Age =18 'No Problem
End Class
كود:
Structure Person
Dim **** As String =
"Mr_MOHAMMED" 'Error
Dim Age As Age =18 'Error
End Structure
وبالتطرق لقضية أخرى : بامكانك تعريف حقل داخل الفئة من نوع هذه الفئة
وهذا يفيد في خوارزميات المكدسة(LIFO)
والطوابير(FIFO)
مثال:
كود:
Class Person
Dim Im As Person
...
...
End Class
_____________
مداخلة بسيطة:
المكدسة (LIFO) اختصار ل Last In First Out أي آخر
ما يدخل أول ما يخرج
الطابور(FIFO) اختصار ل First In First Out أي أول
ما يدخل أول ما يخرج
_____________
يمكن للحقول أن تكون على شكل
مصفوفات
مثال:
كود:
Class Person
Dim ****() As String = {"Mr" ,
"_" , "MOHAMMED"}
End Class
لكن ماذا ان أردت حماية الحقل من تغيير قيمته ..يمكن ذلك باستخدام الكلمة
المحجوزة ReadOnly وتعني للقراءة فقط
كود:
Class Person
Public ReadOnly Relegion As String =
"Islam and broud"
End Class
وبذلك لن يستطيع المستخدم تغيير قيمة المتغير بعد جعله مقروء فقط
لحظة...بماذ تختلف ReadOnly عن Const أي ماذا
يختلف هذا المتغير المحمي عن الثابت ان لن نقدر على تغيير قيمته
الاختلاف بينهما أن الثابت يجب
عليك اسناد قيمته وقت كتابته أم المتغير المحمي فلك الخيار اما أن تسند قيمته وفت كتابته
أو تعطيه قيمته عند أول عملية اسناد ولن يتغير بعدها في ي عملية اسناد أخرى
الطرق Methods
الطرق ما هي الا اجراءات ودوال
ويمكنك مراجعتها من هذا الفصل:
الدرس(9): الدوال والاجراءات
كيف يمكنني الاستفادة من الطرق:
1) بوساطة الطرق يمكنك صنع أحداث
هذا الكائن
توضيح:
الآن نحن البشر نستطيع المشي
يمكننا تطبيق ذلك بكل سهولة في عالم البرمجة الكائنية
لنقم بصنع فئة نسميها انسان ونطبق
عليها المبدأ السابق:
في داخل جسم الفئة Person نضيف اجراء
جديد نسميه Walk وداخل هذا الاجراء نحدد كيفية المشي
كود:
Class Person
Sub walk()
....
....
....
End Sub
End Class
وطريقة استدعاء هذا الاجراء هي
كالتالي:
كود:
Dim Lo2i As Person
Lo2i.Walk()
وبهذا نكون قد صنعنا متغير من
النوع Person أسميناه
Lo2i (سامحني يا لؤي بدي اغلبك
معي ) وقمنا باستدعاء اجراء المشي الخاص بLo2i
...
2) مثال رائع وجدته في كتاب الاستاذ
تركي العسيري...
باستخدام الطرق يمكنك اختصار
الاسطر والوقت في اسناد القيم لعناصر الفئة
توضيح:
كود:
Class PersonRecord
Public **** As String
Public Age As Integer
Public Address As String
End Class
في المثال السابق تم صنع فئة جديدة سميت PersonRecord
وتم اضافة بضعة حقول لها **** و Age
وAdress ويمكننا اسناد القيم لتلك الحقول بالشكل التالي:
كود:
Dim PersonObject As New PersonRecord
PersonObject.**** = "Turki"
PersonObject.Age = 99
PersonObject.Address = "Suadia"
لكن كيف تفيدنا الطرق باختصار الأسطر والوقت
دعنا نرجع لذات الفئة, باضافة
اجراء داخل الفئة لعملية اسناد القيم الثلاثة:
كود:
Class PersonRecord
Public **** As String
Public Age As Integer
Public Address As String
Sub SetValues(ByVal Person**** As
String,ByVal PersonAge As Integer, ByVal PersonAddress As String)
**** = Person****
Age = PersonAge
Address = PersonAddress
End Sub
End Class
الشرح:
اضفنا اجراء جديد باسم SetValues ومهمته
اسناد القيم للحقول الثلاثة وفي هذا الاجراء نقوم بتمرير ثلاثة وسيطات حسب الحقول المراد
استغراقها وبالتالي فان عملية الاسناد اصبحت بالشكل التالي:
كود:
Dim PersonObject As New PersonRecord
PersonObject.SetValues("Turki",
99, "Suadia")
مبدأ إعادة التعريف OverLoading
من مبادئ البرمجة الكائنية التوجه
مبدأ إعادة تعريف الطرق بوسيطات مختلفة وجوبا:
مثال:
لدينا الطريقة OverTest سنقيم عليها
مبدا إعادة التعريف:
كود:
Sub OverTest()
End Sub
كود:
Sub OverTest(ByVal Var1 As Integer)
End Sub
كود:
Sub OverTest(ByVal Var2 As String(
End Sub
قد تلاحظ أننا قمنا بتغيير نوع
المتغير Var1 في الاجراء
الثالث بالرغم من تغيير المتغير وهذا من أسس مبدأ إعادة الوراثة...
اذ ان الأمر اعادة التعريف التالية
تصدر خطأ لاننا بالرغم من تغيير اسم الوسيط لم نغير نوعه ولك التجربة
كود:
Sub OverTest ( ByVal Var1 As Integer(
End Sub
كود:
Sub OverTest ( ByVal Var2 As Integer(
End Sub
معوقات عملية إعادة التعريف
السبب الذي وضحناه بالاعلى..ثبات نوع الوسيط
تغيير نوع الارسال يصدر خطأ:
المثال التالي يصدر خطأ لتغيير
نوع ارسال الوسطيات
كود:
Sub OverTest ( ByVal Var1 As Integer(
End Sub
كود:
OverTest ( ByRef Var2 As Integer(
End Sub
تغيير محدد الوصول أيضا يصدر خطأ
المثال التالي يصدر خطأ لتغيير
محدد الوصول
كود:
Public Sub OverTest ( ByVal Var1 As
Integer(
End Sub
كود:
Private Sub OverTest ( ByRef Var2 As
Integer(
End Sub
في النهاية عند تطبيق مبدأ اعادة التعريف يستحسن استخدام الكلمة المحجوزة
OverLoads لتسريع
عمل المترجم
مثال:
كود:
OverLoads Sub OverTest(ByVal Var1 As
Integer(
End Sub
كود:
OverLoads Sub OverTest(ByVal Var2 As
String(
End Sub
تكمن أهمية مبدأ إعادة التعريف في تسهيل عمل المبرمج :
المثال التالي سيوضح كيف:
الآن عندما نطلب من المستخدم
ادخال عمره هل نضمن أنه سيدخله حرفيا ام رقميا...بهذا ستضطر لخوارزمية اكثر تعقيدا
بدءا بقنص الأخطاء الواردة مرورا بتحويل المدخلات في حال خالفت المطلوب انتهاء بخطأ
وارد في حال فشل العمليتين السابقتين..
لذلك يفيدنا مبدأ إعادة التعريف
في تخطي هذا الخطأ كالتالي:
كود:
Class Person
Overloads Sub SetAge(ByVal Age As String(
End Sub
Overloads Sub SetAge(ByVal Age As Integer(
End Sub
End Class
-----------------------------------
In
Form.Load
كود:
Dim Lo2i As New Person
Lo2i.SetAge(19)
Lo2i.SetAge("تسعة
عشر")
الآن في حال ادخال المستخدم قيمة
حرفية سيتم التعامل معها وفق الاجراء الاول الذي يستقبل نصا بينما إن أدخل قيمة رقمية
سيتم التعامل معها وفق الاجراء الثاني الذي يستقبل رقما بهذا نتخطى احتمالات الوقوع
في خطأ من جراء ادخال قيمة غير النوع المحدد
نكتفي بمبدأ إعادة التعريف حول
موضوع الطرق وهناك بعض القضايا الأخرى التي سيتم شرحها باذن الله وقت حاجتنا لها ان
شاء الله
بهذا نكون قد أنهينا درسنا لهذا
اليوم وسنتحدث في الدرس القادم عن الجزء المتبقي
من الفئات ان شاء الله
مع تحيات:
Abdalkader
Al-badani
انتظروا الدرس القادم
ليست هناك تعليقات:
إرسال تعليق