06-10-15, 06:50 PM
السلام عليكم ورجمة الله وبركاته
الكلاس Object هو كلاس يدعم جميع الكلاسات التي يتم كتابتها في الدوت نت أو بمعني أخر هذا الكلاس هو الأساس لكل الكلاسات الموجودة في الدوت نت
اليوم كنت احاول ان اكتب كلاس لأخذ صورة كاملة من سطح المكتب و تحويلها الي صورة شفافة و كنت أريد أن أنسخ هذه الصورة او بمعني أدق يكون لدي إمكانية الحصول علي نسخة من هذا الصورة قبل التعديل عليها لذلك أردت للكلاس الخاص بي أن يدعم ICloneable Intefrace
جميعكم سوف يلاحظون وعند كتابة أي كلاس جديد نجد ان الكلاس يحتوي علي بعض الدوال و الطرق التي تكون جزء من الكود الخاص بنا و من ضمن هذا الطرق و الدوال هناك دالة اسمها MemberwiseClone
و في واقع الأمر تلك أول مرة أحاول فيها أن أفهم هذه الدالة و الهدف منها و كيفية الاستفادة منها و لقد كان من الطبيعي أن ألجا لموقع مايكروسوفت لأقرأ عن الموضوع وهناك وجدت مثالا بسيطا لتوضيح كيفية الاستفادة من هذه الدالة
و الهدف من هذا الدالة يتلخص في اننا و باستخدامها نستطيع أن نأخذ نسخة Copy من الكلاس
ولتوضيح الأمر قليلا لنفرض أننا نريد تعريف متغير يعبر عن أي كلاس شاملا البيانات الموجودة فيه
ثم لنفرض اننا نريد نسخة أخري من هذا الكلاس للتعديل عليها ثم استخدامها بشكل اخر و كل ذلك بدون تعريف متغير جديد من الكلاس و بدون أن تتأثر اليبانات الموجودة في المتغير الأصلي
و لمحاولة فهم الأمر بشكل جيد أخذت الكود الموجود في موقع مايكروسوفت و أعدت كتابته كما هو ثم بعد ذلك أعدت صياغته بشكل مختلف قليلا حتي يتضح لي الأمر تماماو الكود التالي يوضح الأمر:
و الكود التالي يوضح كيفية تعريف متغير عن الكلاس ثم التعديل في بياناته ثم استخدامها مرة أخري
لينك المرجع
في المرفقات يوجد نسخة من الكود اعلاه
الكلاس Object هو كلاس يدعم جميع الكلاسات التي يتم كتابتها في الدوت نت أو بمعني أخر هذا الكلاس هو الأساس لكل الكلاسات الموجودة في الدوت نت
اليوم كنت احاول ان اكتب كلاس لأخذ صورة كاملة من سطح المكتب و تحويلها الي صورة شفافة و كنت أريد أن أنسخ هذه الصورة او بمعني أدق يكون لدي إمكانية الحصول علي نسخة من هذا الصورة قبل التعديل عليها لذلك أردت للكلاس الخاص بي أن يدعم ICloneable Intefrace
جميعكم سوف يلاحظون وعند كتابة أي كلاس جديد نجد ان الكلاس يحتوي علي بعض الدوال و الطرق التي تكون جزء من الكود الخاص بنا و من ضمن هذا الطرق و الدوال هناك دالة اسمها MemberwiseClone
و في واقع الأمر تلك أول مرة أحاول فيها أن أفهم هذه الدالة و الهدف منها و كيفية الاستفادة منها و لقد كان من الطبيعي أن ألجا لموقع مايكروسوفت لأقرأ عن الموضوع وهناك وجدت مثالا بسيطا لتوضيح كيفية الاستفادة من هذه الدالة
و الهدف من هذا الدالة يتلخص في اننا و باستخدامها نستطيع أن نأخذ نسخة Copy من الكلاس
ولتوضيح الأمر قليلا لنفرض أننا نريد تعريف متغير يعبر عن أي كلاس شاملا البيانات الموجودة فيه
ثم لنفرض اننا نريد نسخة أخري من هذا الكلاس للتعديل عليها ثم استخدامها بشكل اخر و كل ذلك بدون تعريف متغير جديد من الكلاس و بدون أن تتأثر اليبانات الموجودة في المتغير الأصلي
و لمحاولة فهم الأمر بشكل جيد أخذت الكود الموجود في موقع مايكروسوفت و أعدت كتابته كما هو ثم بعد ذلك أعدت صياغته بشكل مختلف قليلا حتي يتضح لي الأمر تماماو الكود التالي يوضح الأمر:
كود :
Public Class Person
Implements ICloneable
Public ID As PersonID
Public Age As Integer
Public Name As String
Public Function Clone() As Object Implements ICloneable.Clone
Return Me.CreateDeepCopy(CreateShallowCopy())
End Function
Friend Function CreateShallowCopy() As Person
Return CType(Me.MemberwiseClone(), Person)
End Function
Friend Function CreateDeepCopy(current As Person) As Person
Return current
End Function
End Class
كود :
Public Class PersonID
Public IdNumber As Integer
Public Sub New(IdNumber As Integer)
Me.IdNumber = IdNumber
End Sub
End Class ' PersonInfo
و الكود التالي يوضح كيفية تعريف متغير عن الكلاس ثم التعديل في بياناته ثم استخدامها مرة أخري
كود :
Public Class Form1
Private p As Person = CType(Nothing, Person)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
p = New Person
p.Name = "Omar"
p.ID = New PersonID(10)
p.Age = 20
Me.Label1.Text = p.ID.IdNumber
Me.Label2.Text = p.Name
Me.Label3.Text = p.Age
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim deepCopyPerson As Person = p.CreateDeepCopy(p)
Dim copiedPerson As Person = deepCopyPerson.Clone
Me.Label4.Text = copiedPerson.ID.IdNumber + New PersonID(20).IdNumber
Me.Label5.Text = copiedPerson.Name
copiedPerson.Age += 100
Me.Label6.Text = copiedPerson.Age
Me.Button1.Enabled = False
End Sub
End Class
لينك المرجع
في المرفقات يوجد نسخة من الكود اعلاه