منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب
الفرق بين الأصناف Classes و الكائنات Objects - نسخة قابلة للطباعة

+- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb)
+-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182)
+--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184)
+--- الموضوع : الفرق بين الأصناف Classes و الكائنات Objects (/showthread.php?tid=4897)



الفرق بين الأصناف Classes و الكائنات Objects - RaggiTech - 02-10-12

كاتب الموضوع : mmosbaha

بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته

إخواني الكرام:

كتبت هذا الموضوع لأن أساس البرمجة في لغة الدوت نت هي الكائنات

و فهم كيفية عملها يساعد على بناء تطبيقات صحيحة و سريعة لا تستهلك موارد النظام

و تملأ ذاكرة الحاسب بكائنات ليس لها عمل و الذي يسمى بتسريب الذاكرة Memory Leak

و وضعت هذه الصورة المتحركة في بداية الموضوع لأنها توصل الفكرة بأسرع طريقة

و توضّح أغلب الفقرات التي تليها:



سيتم وضع مثال على Class في المشاركة التالية لهذا الموضوع حتى لا نتجاوز عدد الأحرف المسموحة للمشاركة
  • ما هو الصنف Class ؟
[INDENT]- هو برنامج لا يعمل لوحده تستخدمه ضمن برنامجك لأنه لا يحتوي على واجهة Interface للتفاعل مع المستخدم
[/INDENT]
[INDENT]- توجد الأصناف في مكتبات الربط الديناميكي Dynamic Link Library و هي ملفات من نوع DLL

- عندما تضيف أحد هذه المكتبات كمرجع Reference لمشروعك يتم تحميل كود الصنف في الذاكرة
ويضاف مجموعة جديدة من المتغيرات و هذا ما يسمى Class Instantiation أو إعطاء قيم أولية للصنف

- بعد تحميل الصنف في الذاكرة يمكنك تعريف متغير يشير إلى كائن من الصنف الجديد

و تكون قيمة المتغير هي عنوان القسم الذي يحتوي على الكائن الجديد في الذاكرة و اسمه Pointer
[/INDENT]
  • ما هو الكائن Object ؟
[INDENT]- هو مجموعة من المتغيرات في الذاكرة تخزن قيم الخصائص و البارامترت الضرورية لعمل الصنف

- عند إنشاء كائن جديد يتم إنشاء مجموعة من المتغيرات هي نسخة مطابقة للمتغيرات المعرفة في كود الصنف

- إذاً الأصناف هي قوالب نستخدمها لإنشاء كائنات جديدة من نوعها فهي تعتبر كمصنع للكائنات

- يتم استدعاء جميع إجراءات الصنف من لغة التنفيذ Common Language Runtime CLR عند الحاجة لها
و تتصرف بناءاً على قيم المتغيرات للنسخة الحالية Instances من الصنف

أي أن كل كائن له خصائص مستقلة لا تؤثر في خصائص الكائنات الأخرى

إلا إذا كانت من النوع Shared فعندها ستتغير قيمة الخاصية في جميع الكائنات عند تغيرها في الصنف

- عند الإعلان عن متغير من نوع الصنف بالكلمة New يتم تنفيذ الإجراء New() للصنف و هو يسمى Class’s Constructor

- لكل صنف إجراء New إفتراضي لا يحتاج لبارامترات حتى إذا كان الصنف لا يحتوي على الإجراء New

- يمكنك إعادة تعريف الإجراء New يتمرير بارامترات Arguments و يمكن إعادة تعريفه Overload بأكثر من شكل

- تقوم البارمترات يتمرير الخصائص المهمة لعمل الصنف أو لجعله ذو معنى و فائدة
[/INDENT]
  • الفرق بين متغيرات القيمة Value Variablesو متغيرات المرجع Object Variables
[INDENT]- Object Variables المتغيرات التي تحتوي على مرجع لكائن

- تستخدم الكلمة New لإنشاء كائن و عند تجاهلها سيتم تحميل الصنف بالذاكرة بدون إنشاء نسخة عنه

و لن يشير المتغير إلى كائن حقيقي أي أنه لا يحتوي على مرجع للصنف

فمثلاً الكود التالي:


كود :
Dim Member As Vb4ArabMembers
يعلن عن متغير من نوع Vb4ArabMembers لكنها لا تنشئ كائن

- إذا حاولت الوصول لخصائص أو وظائف المتغير سينتج استثناء من نوع NullReferenceException

يمعنى أنك تستخدم متغير قبل وضع قيمة فيه

- يمكن أن يحتوي عدد من المتغيرات على نفس المؤشر لكائن واحد

يعني يكون الكائن مرتبط بأكثر من متغير


كود :
Dim Member1 As Vb4ArabMembers
Dim Member2 As New Vb4ArabMembers
Member1 = Member2
- يحتوي المتغيران على مرجع لنفس الكائن و يمكن ضبط خصائص متغير من الثاني


كود :
Member1.MemberId = "Vb4Arab"
أو
Member2.MemberId = "Vb4Arab"
[/INDENT]
[INDENT]- لديك متغيران و كائن واحد في الذاكرة

بمعنى أو ضح المتغير Member1 هو اختصار للكائن الذي تم إنشاؤه عند الإعلان عن المتغير Member2

مثلما تنشئ اختصار لملف معين على سطح المكتب بدلاً من نسخه

يمكنك الوصول لخصائص الكائن من المتغير مثلما يمكنك فتح ملف من إختصاره

- من المفيد أحياناً عدم استعمال الكلمة New لإنشاء كائن إلا عند الحاجة إليه

مثل الإعلان عن المتغير في القسم العام للنافذة و إنشاء الكائن في الإجراء عند الحاجة لاستخدامه

- فقط الأصناف من نوع Shared لا تحتاج للكلمة New و إذا كنت لا تعرف نوع الصنف استخدم New و ستحصل على خطأ عند عدم الحاجة لها

مثلاً الصنف Math يستخدم مباشرة بدون الإعلان عن متغير من نوعه


كود :
Math.Log(123)
[/INDENT]
  • طريقة حذف الكائنات من الذاكرة
[INDENT]- يوجد طريقة خاصة للأدوات و هي تنفيذ الإجراء Dispose
و عيب هذه الطريقة أنه سيحدث خطأ إذا كان هناك متغير آخر يستخدم هذا الكائن


كود :
Dim B As New Button
B.Dispose()
- أو باستخدام الكلمة Using التي ستحذف الكائن عندما تنتهي من استخدامه


كود :
Using B As New Button
End Using
- يتم حذف الكائن من الذاكرة عند عند عدم وجود أي متغير يحتوي على مرجع له إما باستخدام القيمة Nothing


كود :
Member = Nothing
أو بانتهاء عمر جميع المتغيرات التي تستخدمه
[/INDENT]
[INDENT]- تقوم لغة التنفيذ CLR بتنشيط الزبّال Garbage Collector GC لتفريغ الذاكرة من الكائنات الغير مستخدمة و فقاً لشروط معينة

- و يمكن تنشيطه بالكود التالي:
[/INDENT]
[INDENT]
كود :
GC.Collect()
[/INDENT]
[INDENT]- Value Variablesمتغيرات القيمة تخزن قيم البيانات و ليس مرجع لها

مثل أنواع المتغيرات القياسية Integer أو String
و تكون معالجتها أسرع لأنها تخزن في بايتات محدودة أما الكائنات فتحتاج لبناء مركب لتخزينها


كود :
Dim Number1, Number2 As Integer
Number2 = 29
Number1 = Number2
Number2 = 40
ستتم كتابة القيمة الجديدة فوق القديمة ومع أن قيمة المتغيرين واحدة إلا أنهم مستقلين و ستتغير قيمتهم عند تنفيذ السطر الثالث

لو كانا من نوع متغيرات المرجع سيشيران لنفس الكائن بعد السطر الثاني و لن تتمكن من وضع قيم مختلفة فيهم

يتم تحويل متغيرات القيمة إلى إلى متغيرات مرجع فقط عندما تتعامل معهم على أنهم كائنات باستخدام وظائفهم و تسمى هذه العملية Boxing


كود :
MsgBox(Number1.ToString())
[/INDENT]
أخواني الكرام أتوقف عند هذه النقطة و أرجو أن أكون قد قدمت و لو معلومة بسيطة.

بالتوفيق للجميع

هذا و الله أعلم


RE: الفرق بين الأصناف Classes و الكائنات Objects - alsouf - 28-03-18

(02-10-12, 07:49 PM)RaggiTech كتب :
كاتب الموضوع : mmosbaha

بسم الله الرحمن الرحيم

السلام عليكم و رحمة الله و بركاته

إخواني الكرام:

كتبت هذا الموضوع لأن أساس البرمجة في لغة الدوت نت هي الكائنات

و فهم كيفية عملها يساعد على بناء تطبيقات صحيحة و سريعة لا تستهلك موارد النظام

و تملأ ذاكرة الحاسب بكائنات ليس لها عمل و الذي يسمى بتسريب الذاكرة Memory Leak

و وضعت هذه الصورة المتحركة في بداية الموضوع لأنها توصل الفكرة بأسرع طريقة

و توضّح أغلب الفقرات التي تليها:



سيتم وضع مثال على Class في المشاركة التالية لهذا الموضوع حتى لا نتجاوز عدد الأحرف المسموحة للمشاركة
  • ما هو الصنف Class ؟
[INDENT]- هو برنامج لا يعمل لوحده تستخدمه ضمن برنامجك لأنه لا يحتوي على واجهة Interface للتفاعل مع المستخدم
[/INDENT]
[INDENT]- توجد الأصناف في مكتبات الربط الديناميكي Dynamic Link Library و هي ملفات من نوع DLL

- عندما تضيف أحد هذه المكتبات كمرجع Reference لمشروعك يتم تحميل كود الصنف في الذاكرة
ويضاف مجموعة جديدة من المتغيرات و هذا ما يسمى Class Instantiation أو إعطاء قيم أولية للصنف

- بعد تحميل الصنف في الذاكرة يمكنك تعريف متغير يشير إلى كائن من الصنف الجديد

و تكون قيمة المتغير هي عنوان القسم الذي يحتوي على الكائن الجديد في الذاكرة و اسمه Pointer
[/INDENT]
  • ما هو الكائن Object ؟
[INDENT]- هو مجموعة من المتغيرات في الذاكرة تخزن قيم الخصائص و البارامترت الضرورية لعمل الصنف

- عند إنشاء كائن جديد يتم إنشاء مجموعة من المتغيرات هي نسخة مطابقة للمتغيرات المعرفة في كود الصنف

- إذاً الأصناف هي قوالب نستخدمها لإنشاء كائنات جديدة من نوعها فهي تعتبر كمصنع للكائنات

- يتم استدعاء جميع إجراءات الصنف من لغة التنفيذ Common Language Runtime CLR عند الحاجة لها
و تتصرف بناءاً على قيم المتغيرات للنسخة الحالية Instances من الصنف

أي أن كل كائن له خصائص مستقلة لا تؤثر في خصائص الكائنات الأخرى

إلا إذا كانت من النوع Shared فعندها ستتغير قيمة الخاصية في جميع الكائنات عند تغيرها في الصنف

- عند الإعلان عن متغير من نوع الصنف بالكلمة New يتم تنفيذ الإجراء New() للصنف و هو يسمى Class’s Constructor

- لكل صنف إجراء New إفتراضي لا يحتاج لبارامترات حتى إذا كان الصنف لا يحتوي على الإجراء New

- يمكنك إعادة تعريف الإجراء New يتمرير بارامترات Arguments و يمكن إعادة تعريفه Overload بأكثر من شكل

- تقوم البارمترات يتمرير الخصائص المهمة لعمل الصنف أو لجعله ذو معنى و فائدة
[/INDENT]
  • الفرق بين متغيرات القيمة Value Variablesو متغيرات المرجع Object Variables
[INDENT]- Object Variables المتغيرات التي تحتوي على مرجع لكائن

- تستخدم الكلمة New لإنشاء كائن و عند تجاهلها سيتم تحميل الصنف بالذاكرة بدون إنشاء نسخة عنه

و لن يشير المتغير إلى كائن حقيقي أي أنه لا يحتوي على مرجع للصنف

فمثلاً الكود التالي:


كود :
Dim Member As Vb4ArabMembers
يعلن عن متغير من نوع Vb4ArabMembers لكنها لا تنشئ كائن

- إذا حاولت الوصول لخصائص أو وظائف المتغير سينتج استثناء من نوع NullReferenceException

يمعنى أنك تستخدم متغير قبل وضع قيمة فيه

- يمكن أن يحتوي عدد من المتغيرات على نفس المؤشر لكائن واحد

يعني يكون الكائن مرتبط بأكثر من متغير


كود :
Dim Member1 As Vb4ArabMembers
Dim Member2 As New Vb4ArabMembers
Member1 = Member2
- يحتوي المتغيران على مرجع لنفس الكائن و يمكن ضبط خصائص متغير من الثاني


كود :
Member1.MemberId = "Vb4Arab"
أو
Member2.MemberId = "Vb4Arab"
[/INDENT]
[INDENT]- لديك متغيران و كائن واحد في الذاكرة

بمعنى أو ضح المتغير Member1 هو اختصار للكائن الذي تم إنشاؤه عند الإعلان عن المتغير Member2

مثلما تنشئ اختصار لملف معين على سطح المكتب بدلاً من نسخه

يمكنك الوصول لخصائص الكائن من المتغير مثلما يمكنك فتح ملف من إختصاره

- من المفيد أحياناً عدم استعمال الكلمة New لإنشاء كائن إلا عند الحاجة إليه

مثل الإعلان عن المتغير في القسم العام للنافذة و إنشاء الكائن في الإجراء عند الحاجة لاستخدامه

- فقط الأصناف من نوع Shared لا تحتاج للكلمة New و إذا كنت لا تعرف نوع الصنف استخدم New و ستحصل على خطأ عند عدم الحاجة لها

مثلاً الصنف Math يستخدم مباشرة بدون الإعلان عن متغير من نوعه


كود :
Math.Log(123)
[/INDENT]
  • طريقة حذف الكائنات من الذاكرة
[INDENT]- يوجد طريقة خاصة للأدوات و هي تنفيذ الإجراء Dispose
و عيب هذه الطريقة أنه سيحدث خطأ إذا كان هناك متغير آخر يستخدم هذا الكائن


كود :
Dim B As New Button
B.Dispose()
- أو باستخدام الكلمة Using التي ستحذف الكائن عندما تنتهي من استخدامه


كود :
Using B As New Button
End Using
- يتم حذف الكائن من الذاكرة عند عند عدم وجود أي متغير يحتوي على مرجع له إما باستخدام القيمة Nothing


كود :
Member = Nothing
أو بانتهاء عمر جميع المتغيرات التي تستخدمه
[/INDENT]
[INDENT]- تقوم لغة التنفيذ CLR بتنشيط الزبّال Garbage Collector GC لتفريغ الذاكرة من الكائنات الغير مستخدمة و فقاً لشروط معينة

- و يمكن تنشيطه بالكود التالي:
[/INDENT]
[INDENT]
كود :
GC.Collect()
[/INDENT]
[INDENT]- Value Variablesمتغيرات القيمة تخزن قيم البيانات و ليس مرجع لها

مثل أنواع المتغيرات القياسية Integer أو String
و تكون معالجتها أسرع لأنها تخزن في بايتات محدودة أما الكائنات فتحتاج لبناء مركب لتخزينها


كود :
Dim Number1, Number2 As Integer
Number2 = 29
Number1 = Number2
Number2 = 40
ستتم كتابة القيمة الجديدة فوق القديمة ومع أن قيمة المتغيرين واحدة إلا أنهم مستقلين و ستتغير قيمتهم عند تنفيذ السطر الثالث

لو كانا من نوع متغيرات المرجع سيشيران لنفس الكائن بعد السطر الثاني و لن تتمكن من وضع قيم مختلفة فيهم

يتم تحويل متغيرات القيمة إلى إلى متغيرات مرجع فقط عندما تتعامل معهم على أنهم كائنات باستخدام وظائفهم و تسمى هذه العملية Boxing


كود :
MsgBox(Number1.ToString())
[/INDENT]
أخواني الكرام أتوقف عند هذه النقطة و أرجو أن أكون قد قدمت و لو معلومة بسيطة.

بالتوفيق للجميع

هذا و الله أعلم