عرب تك
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

اذهب الى الأسفل
avatar
tarik
عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012

مدخل الى الفئاتClasses - الجزء الأول  Empty مدخل الى الفئاتClasses - الجزء الأول

الخميس أكتوبر 18, 2012 11:19 am
السلام عليكم ورحمة الله وبركاته
بسم الله الرحمن الرحيم

عندما نتحدث عن الفيجوال بيسك دوت نت فاننا نتحدث عن لغة كائنية(غرضية) التوجه...
كتوضيح: العالم من حولنا مليء بالكائنات وكل كائن له خصائصه وسماته وهذا ما يتم تطبيقه في لغة البرمجة كائنية التوجه حيث يتم اعتبار مساحة العمل كالعالم فتكون الكائنات وتحدد خصائصها وسماتها وتستخدم ظواهرها في عملك..

الآن سنتطرق الى أهم مواضيع البرمجة كائنية التوجه 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
الآن كما ترى فاننا قمنا ببناء فئة جديدة أسميناها Person وأضفنا لها خصائص الاسم والعمر والوزن
ولكي تستطيع الوصول الى عناصر الفئة فانظر المثال التالي:
الكود:

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 من النوع ذات القيمة
راجع:الفصل(Cool: الدوال والاجراءات
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
أي ان التركيبة empty يجب أن تحتوي على عضو ابتدائي متغير أو اجراء


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
كما نرى فان هذه الفئة تحتوى على فئتين أو أكثر وهما Name و Age
أيضا من مجمل الفروق بين الفئة والتركيبة 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
لكن ماذا ان أردت حماية الحقل من تغيير قيمته ..يمكن ذلك باستخدام الكلمة المحجوزة ReadOnly وتعني للقراءة فقط

الكود:

Class Person
Public ReadOnly Relegion As String = "Islam and broud"
End Class
وبذلك لن يستطيع المستخدم تغيير قيمة المتغير بعد جعله مقروء فقط
لحظة...بماذ تختلف ReadOnly عن Const أي ماذا يختلف هذا المتغير المحمي عن الثابت ان لن نقدر على تغيير قيمته
الاختلاف بينهما أن الثابت يجب عليك اسناد قيمته وقت كتابته أم المتغير المحمي فلك الخيار اما أن تسند قيمته وفت كتابته أو تعطيه قيمته عند أول عملية اسناد ولن يتغير بعدها في ي عملية اسناد أخرى



الطرق Methods

الطرق ما هي الا اجراءات ودوال ويمكنك مراجعتها من هذا الفصل:
الفصل(Cool: الدوال والاجراءات

كيف يمكنني الاستفادة من الطرق:

1) بوساطة الطرق يمكنك صنع أحداث هذا الكائن
توضيح:
الآن نحن البشر نستطيع المشي يمكننا تطبيق ذلك بكل سهولة في عالم البرمجة الكائنية
لنقم بصنع فئة نسميها انسان ونطبق عليها المبدأ السابق:
في داخل جسم الفئة Person نضيف اجراء جديد نسميه Walk وداخل هذا الاجراء نحدد كيفية المشي

الكود:

Class Person
 Sub walk()
....
....
....
 End Sub
End Class
وطريقة استدعاء هذا الاجراء هي كالتالي:

الكود:

Dim Lo2i As Person
Lo2i.Walk()
وبهذا نكون قد صنعنا متغير من النوع Person أسميناه Lo2i (سامحني يا لؤي بدي اغلبك معي ) وقمنا باستدعاء اجراء المشي الخاص بLo2i ...


2) مثال رائع وجدته في كتاب الاستاذ تركي العسيري...
باستخدام الطرق يمكنك اختصار الاسطر والوقت في اسناد القيم لعناصر الفئة
توضيح:



الكود:

Class PersonRecord
        Public Name As String
        Public Age As Integer
        Public Address As String
 End Class
في المثال السابق تم صنع فئة جديدة سميت PersonRecord وتم اضافة بضعة حقول لها Name و Age وAdress ويمكننا اسناد القيم لتلك الحقول بالشكل التالي:

الكود:

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")
مبدأ إعادة التعريف OverLoading


من مبادئ البرمجة الكائنية التوجه مبدأ إعادة تعريف الطرق بوسيطات مختلفة وجوبا:
مثال:
لدينا الطريقة 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("تسعة عشر")
الآن في حال ادخال المستخدم قيمة حرفية سيتم التعامل معها وفق الاجراء الاول الذي يستقبل نصا بينما إن أدخل قيمة رقمية سيتم التعامل معها وفق الاجراء الثاني الذي يستقبل رقما بهذا نتخطى احتمالات الوقوع في خطأ من جراء ادخال قيمة غير النوع المحدد

نكتفي بمبدأ إعادة التعريف حول موضوع الطرق وهناك بعض القضايا الأخرى التي سيتم شرحها باذن الله وقت حاجتنا لها ان شاء الله



بهذا نكون قد أنهينا فصلنا لهذا اليوم وسنتحدث في الفصل القادم عن الجزء المتبقي من الفئات ان شاء الله
الرجوع الى أعلى الصفحة
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى