- tarik
- عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
مدخل الى الفئاتClasses - الجزء الأول
الخميس أكتوبر 18, 2012 11:19 am
السلام عليكم ورحمة الله وبركاته
بسم الله الرحمن الرحيم
عندما نتحدث عن الفيجوال بيسك دوت نت فاننا نتحدث عن لغة كائنية(غرضية) التوجه...
كتوضيح: العالم من حولنا مليء بالكائنات وكل كائن له خصائصه وسماته وهذا ما يتم تطبيقه في لغة البرمجة كائنية التوجه حيث يتم اعتبار مساحة العمل كالعالم فتكون الكائنات وتحدد خصائصها وسماتها وتستخدم ظواهرها في عملك..
الآن سنتطرق الى أهم مواضيع البرمجة كائنية التوجه OOP وهو موضوع الفئات Classes..
الفئة(Class): عبارة عن قالب يمكنك بواستطه تشكيل الكائنات التي حددت صفاتها ومن ثم استخدمها..كتشبيه يمكن اعتبارها كقالب الأحذية -أعزكم الله- التي يمكنك بواستطها انشاء حذاء بمواصفات هذا القالب.
يتم انشاء Class باستخدام الكلمة المحجوزة Class وتنهيه بالعبارة المشهورة End Class
مثال:
لنأخذ مثال:
ولكي تستطيع الوصول الى عناصر الفئة فانظر المثال التالي:
والنتيجة:
فتح الصورة بصفحة مستقلة
لعلك انتبهت إلى أن الفئة بتركيبتها البرمجية تشبه كثيرا تركيبة Structure فيمكن صنع فئة من تركيبة Structure باستبدال كلمة Structure بكلمة Class
راجع: الفصل(3): التركيبات أنواعها واستخداماتها
لكن هناك شيء من الاختلاف بين الفئة والتركيبة Structue
1)
الفئة من النوع المرجعي بينما التركيبة Structure من النوع ذات القيمة
راجع:الفصل(: الدوال والاجراءات
2)
الفئة يمكن أن لا تحتوي على أعضاء بينما التركيبة تصدر رسالة خطأ عند خلوها من العناصر
3)
المحدد الافتراضي للفئة هو Private
بينما المحدد الافتراضي لتركيبة الStructure هو Public
4)
يمكننا تطبيق مبدأ الورائة والاشتقاق على الفئات
بينما التركيبات فلا
___________________________
ملاحظة: يمكن للفئة أن تكون متداخلة Nested
مثال:
ملاحظة أخرى:بامكاننا استخدام الفئة كوسيط نرسله للاجراءات والدوال بالطريقتين التي ذكرناها (الارسال بالمرجع أو بالقيمة) وبالرغم من انك ارسلته بالقيمة فان الجراء الحاضن سيغير قيمة المرسل بالرغم من ان ارسال الوسيط تم بالقيمة وهذا يتطابق مع الفرق الذي ذكرناه بالاعلى أن الفئة من النوع المرجعي...
كل ما سبق نظرة مبسطة جدا عن الفئات...
الآن تحدثنا أن الفئة تمثل كائن والكائن له أعضاء إذن الفئة لها أعضاء ويمكن تقسيمها لاربعة مكونات:
الحقول Fields
تعتبر الحقول أصغر وأبسط مكونات الفئة وما هي الا متغيرات عادية.
مثال:
أيضا من مجمل الفروق بين الفئة والتركيبة Structure فان حقول الفئة يكمن اسناد قيم لها وقت كتابة الفئة بخلاف التركيبة Structure
توضيح:
وبالتطرق لقضية أخرى : بامكانك تعريف حقل داخل الفئة من نوع هذه الفئة وهذا يفيد في خوارزميات المكدسة(LIFO) والطوابير(FIFO)
مثال:
مداخلة بسيطة:
المكدسة (LIFO) اختصار ل Last In First Out أي آخر ما يدخل أول ما يخرج
الطابور(FIFO) اختصار ل First In First Out أي أول ما يدخل أول ما يخرج
_____________
يمكن للحقول أن تكون على شكل مصفوفات
مثال:
لحظة...بماذ تختلف ReadOnly عن Const أي ماذا يختلف هذا المتغير المحمي عن الثابت ان لن نقدر على تغيير قيمته
الاختلاف بينهما أن الثابت يجب عليك اسناد قيمته وقت كتابته أم المتغير المحمي فلك الخيار اما أن تسند قيمته وفت كتابته أو تعطيه قيمته عند أول عملية اسناد ولن يتغير بعدها في ي عملية اسناد أخرى
الطرق Methods
الطرق ما هي الا اجراءات ودوال ويمكنك مراجعتها من هذا الفصل:
الفصل(: الدوال والاجراءات
كيف يمكنني الاستفادة من الطرق:
1) بوساطة الطرق يمكنك صنع أحداث هذا الكائن
توضيح:
الآن نحن البشر نستطيع المشي يمكننا تطبيق ذلك بكل سهولة في عالم البرمجة الكائنية
لنقم بصنع فئة نسميها انسان ونطبق عليها المبدأ السابق:
في داخل جسم الفئة Person نضيف اجراء جديد نسميه Walk وداخل هذا الاجراء نحدد كيفية المشي
2) مثال رائع وجدته في كتاب الاستاذ تركي العسيري...
باستخدام الطرق يمكنك اختصار الاسطر والوقت في اسناد القيم لعناصر الفئة
توضيح:
دعنا نرجع لذات الفئة, باضافة اجراء داخل الفئة لعملية اسناد القيم الثلاثة:
اضفنا اجراء جديد باسم SetValues ومهمته اسناد القيم للحقول الثلاثة وفي هذا الاجراء نقوم بتمرير ثلاثة وسيطات حسب الحقول المراد استغراقها وبالتالي فان عملية الاسناد اصبحت بالشكل التالي:
من مبادئ البرمجة الكائنية التوجه مبدأ إعادة تعريف الطرق بوسيطات مختلفة وجوبا:
مثال:
لدينا الطريقة OverTest سنقيم عليها مبدا إعادة التعريف:
قد تلاحظ أننا قمنا بتغيير نوع المتغير Var1 في الاجراء الثالث بالرغم من تغيير المتغير وهذا من أسس مبدأ إعادة الوراثة...
اذ ان الأمر اعادة التعريف التالية تصدر خطأ لاننا بالرغم من تغيير اسم الوسيط لم نغير نوعه ولك التجربة
معوقات عملية إعادة التعريف
السبب الذي وضحناه بالاعلى..ثبات نوع الوسيط
تغيير نوع الارسال يصدر خطأ:
المثال التالي يصدر خطأ لتغيير نوع ارسال الوسطيات
تغيير محدد الوصول أيضا يصدر خطأ
المثال التالي يصدر خطأ لتغيير محدد الوصول
في النهاية عند تطبيق مبدأ اعادة التعريف يستحسن استخدام الكلمة المحجوزة OverLoads لتسريع عمل المترجم
مثال:
تكمن أهمية مبدأ إعادة التعريف في تسهيل عمل المبرمج :
المثال التالي سيوضح كيف:
الآن عندما نطلب من المستخدم ادخال عمره هل نضمن أنه سيدخله حرفيا ام رقميا...بهذا ستضطر لخوارزمية اكثر تعقيدا بدءا بقنص الأخطاء الواردة مرورا بتحويل المدخلات في حال خالفت المطلوب انتهاء بخطأ وارد في حال فشل العمليتين السابقتين..
لذلك يفيدنا مبدأ إعادة التعريف في تخطي هذا الخطأ كالتالي:
نكتفي بمبدأ إعادة التعريف حول موضوع الطرق وهناك بعض القضايا الأخرى التي سيتم شرحها باذن الله وقت حاجتنا لها ان شاء الله
بهذا نكون قد أنهينا فصلنا لهذا اليوم وسنتحدث في الفصل القادم عن الجزء المتبقي من الفئات ان شاء الله
بسم الله الرحمن الرحيم
عندما نتحدث عن الفيجوال بيسك دوت نت فاننا نتحدث عن لغة كائنية(غرضية) التوجه...
كتوضيح: العالم من حولنا مليء بالكائنات وكل كائن له خصائصه وسماته وهذا ما يتم تطبيقه في لغة البرمجة كائنية التوجه حيث يتم اعتبار مساحة العمل كالعالم فتكون الكائنات وتحدد خصائصها وسماتها وتستخدم ظواهرها في عملك..
الآن سنتطرق الى أهم مواضيع البرمجة كائنية التوجه OOP وهو موضوع الفئات Classes..
الفئة(Class): عبارة عن قالب يمكنك بواستطه تشكيل الكائنات التي حددت صفاتها ومن ثم استخدمها..كتشبيه يمكن اعتبارها كقالب الأحذية -أعزكم الله- التي يمكنك بواستطها انشاء حذاء بمواصفات هذا القالب.
يتم انشاء Class باستخدام الكلمة المحجوزة Class وتنهيه بالعبارة المشهورة End Class
مثال:
- الكود:
Class ClassName
End Class
لنأخذ مثال:
- الكود:
Class Person
Public Name As String
Public Age As Integer
Public Weight As Double
End Class
ولكي تستطيع الوصول الى عناصر الفئة فانظر المثال التالي:
- الكود:
Dim x As New Person
x.Name = "Lo2i"
x.Age = 20
x.Weight = 70
MsgBox("Name is " & x.Name & vbCrLf & "Age: " & Str(x.Age) & vbCrLf & "Weight: " & Str(x.Weight))
والنتيجة:
فتح الصورة بصفحة مستقلة
لعلك انتبهت إلى أن الفئة بتركيبتها البرمجية تشبه كثيرا تركيبة Structure فيمكن صنع فئة من تركيبة Structure باستبدال كلمة Structure بكلمة Class
راجع: الفصل(3): التركيبات أنواعها واستخداماتها
لكن هناك شيء من الاختلاف بين الفئة والتركيبة Structue
1)
الفئة من النوع المرجعي بينما التركيبة Structure من النوع ذات القيمة
راجع:الفصل(: الدوال والاجراءات
2)
الفئة يمكن أن لا تحتوي على أعضاء بينما التركيبة تصدر رسالة خطأ عند خلوها من العناصر
- الكود:
Class empty
No Problems
End Class
كود PHP:
Structure empty
'Error text: Error Structure 'empty must contain at least one instance member variable or Event declaration
End Structure
3)
المحدد الافتراضي للفئة هو Private
بينما المحدد الافتراضي لتركيبة الStructure هو Public
4)
يمكننا تطبيق مبدأ الورائة والاشتقاق على الفئات
بينما التركيبات فلا
___________________________
ملاحظة: يمكن للفئة أن تكون متداخلة Nested
مثال:
- الكود:
Class Person
Class Name
Public First As String
Public Last As String
End Class
Public Age As Integer
End Class
ملاحظة أخرى:بامكاننا استخدام الفئة كوسيط نرسله للاجراءات والدوال بالطريقتين التي ذكرناها (الارسال بالمرجع أو بالقيمة) وبالرغم من انك ارسلته بالقيمة فان الجراء الحاضن سيغير قيمة المرسل بالرغم من ان ارسال الوسيط تم بالقيمة وهذا يتطابق مع الفرق الذي ذكرناه بالاعلى أن الفئة من النوع المرجعي...
كل ما سبق نظرة مبسطة جدا عن الفئات...
الآن تحدثنا أن الفئة تمثل كائن والكائن له أعضاء إذن الفئة لها أعضاء ويمكن تقسيمها لاربعة مكونات:
- الكود:
الحقول(Fields)
الطرق(Methods)
الخصائص(properties)
الأحداث(Events)
الحقول Fields
تعتبر الحقول أصغر وأبسط مكونات الفئة وما هي الا متغيرات عادية.
مثال:
- الكود:
Class Person
Dim Name As String 'Field
Dim Age As Integer 'Field
...
...
...
End Class
أيضا من مجمل الفروق بين الفئة والتركيبة Structure فان حقول الفئة يكمن اسناد قيم لها وقت كتابة الفئة بخلاف التركيبة Structure
توضيح:
- الكود:
Class Person
Dim Name As String = "Mr_MOHAMMED" 'No Problem
Dim Age As Age =18 'No Problem
End Class
كود PHP:
Structure Person
Dim Name 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 Name(2) As String = {"Mr" , "_" , "MOHAMMED"}
End Class
- الكود:
Class Person
Public ReadOnly Relegion As String = "Islam and broud"
End Class
لحظة...بماذ تختلف ReadOnly عن Const أي ماذا يختلف هذا المتغير المحمي عن الثابت ان لن نقدر على تغيير قيمته
الاختلاف بينهما أن الثابت يجب عليك اسناد قيمته وقت كتابته أم المتغير المحمي فلك الخيار اما أن تسند قيمته وفت كتابته أو تعطيه قيمته عند أول عملية اسناد ولن يتغير بعدها في ي عملية اسناد أخرى
الطرق Methods
الطرق ما هي الا اجراءات ودوال ويمكنك مراجعتها من هذا الفصل:
الفصل(: الدوال والاجراءات
كيف يمكنني الاستفادة من الطرق:
1) بوساطة الطرق يمكنك صنع أحداث هذا الكائن
توضيح:
الآن نحن البشر نستطيع المشي يمكننا تطبيق ذلك بكل سهولة في عالم البرمجة الكائنية
لنقم بصنع فئة نسميها انسان ونطبق عليها المبدأ السابق:
في داخل جسم الفئة Person نضيف اجراء جديد نسميه Walk وداخل هذا الاجراء نحدد كيفية المشي
- الكود:
Class Person
Sub walk()
....
....
....
End Sub
End Class
- الكود:
Dim Lo2i As Person
Lo2i.Walk()
2) مثال رائع وجدته في كتاب الاستاذ تركي العسيري...
باستخدام الطرق يمكنك اختصار الاسطر والوقت في اسناد القيم لعناصر الفئة
توضيح:
- الكود:
Class PersonRecord
Public Name As String
Public Age As Integer
Public Address As String
End Class
- الكود:
Dim PersonObject As New PersonRecord
PersonObject.Name = "Turki"
PersonObject.Age = 99
PersonObject.Address = "Suadia"
دعنا نرجع لذات الفئة, باضافة اجراء داخل الفئة لعملية اسناد القيم الثلاثة:
- الكود:
Class PersonRecord
Public Name As String
Public Age As Integer
Public Address As String
Sub SetValues(ByVal PersonName As String,ByVal PersonAge As Integer, ByVal PersonAddress As String)
Name = PersonName
Age = PersonAge
Address = PersonAddress
End Sub
End Class
اضفنا اجراء جديد باسم SetValues ومهمته اسناد القيم للحقول الثلاثة وفي هذا الاجراء نقوم بتمرير ثلاثة وسيطات حسب الحقول المراد استغراقها وبالتالي فان عملية الاسناد اصبحت بالشكل التالي:
- الكود:
Dim PersonObject As New PersonRecord
PersonObject.SetValues("Turki", 99, "Suadia")
من مبادئ البرمجة الكائنية التوجه مبدأ إعادة تعريف الطرق بوسيطات مختلفة وجوبا:
مثال:
لدينا الطريقة OverTest سنقيم عليها مبدا إعادة التعريف:
- الكود:
[php]Sub OverTest()
End Sub
- الكود:
Sub OverTest(ByVal Var1 As Integer)
End Sub
- الكود:
Sub OverTest(ByVal Var2 As String)
End Sub
قد تلاحظ أننا قمنا بتغيير نوع المتغير Var1 في الاجراء الثالث بالرغم من تغيير المتغير وهذا من أسس مبدأ إعادة الوراثة...
اذ ان الأمر اعادة التعريف التالية تصدر خطأ لاننا بالرغم من تغيير اسم الوسيط لم نغير نوعه ولك التجربة
- الكود:
[php]Sub OverTest ( ByVal Var1 As Integer)
End Sub
- الكود:
Sub OverTest ( ByVal Var2 As Integer)
End Sub
معوقات عملية إعادة التعريف
السبب الذي وضحناه بالاعلى..ثبات نوع الوسيط
تغيير نوع الارسال يصدر خطأ:
المثال التالي يصدر خطأ لتغيير نوع ارسال الوسطيات
- الكود:
[php]Sub OverTest ( ByVal Var1 As Integer)
End Sub
- الكود:
Sub OverTest ( ByRef Var2 As Integer)
End Sub
تغيير محدد الوصول أيضا يصدر خطأ
المثال التالي يصدر خطأ لتغيير محدد الوصول
- الكود:
PHP]Public Sub OverTest ( ByVal Var1 As Integer)
End Sub
- الكود:
Private Sub OverTest ( ByRef Var2 As Integer)
End Sub
في النهاية عند تطبيق مبدأ اعادة التعريف يستحسن استخدام الكلمة المحجوزة OverLoads لتسريع عمل المترجم
مثال:
- الكود:
PHP]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("تسعة عشر")
نكتفي بمبدأ إعادة التعريف حول موضوع الطرق وهناك بعض القضايا الأخرى التي سيتم شرحها باذن الله وقت حاجتنا لها ان شاء الله
بهذا نكون قد أنهينا فصلنا لهذا اليوم وسنتحدث في الفصل القادم عن الجزء المتبقي من الفئات ان شاء الله
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى