تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Object MemberwiseClone Method
#1
السلام عليكم ورجمة الله وبركاته

الكلاس 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


لينك المرجع

في المرفقات يوجد نسخة من الكود اعلاه


الملفات المرفقة
.rar   Test_MemberWiseClone.rar (الحجم : 71.03 ك ب / التحميلات : 6)
الرد }}}}
#2
موضوع رائع جدا اخوي سيلفرلايت

بالفعل نسخ الاوبجكت في حالات كثيرة يكون شي مفيد جدا



لكن ماذا عن الstrcut ؟ يقولون ان الstruct هو value type اي يخزن في المكدسة

فمككن (نظريا ليس هناك دليل على كلامي Big Grin) انه ممكن نسخ اوبجكت الstruct بهذه الطريقة البدائية (newcopy = orginal)
PHP كود :
    struct Wallet
    
{
        int money;
    }

    class Form1
    
{
        void Form_Load()
        {
            Wallet wal1 = new Wallet();
            wal1.money 4;

            //نسخ التركيب
            Wallet wal2;
            wal2 wal1;
        }
    


ماذا تتوقع اخي سيلفاريلايت هل ممكن نطلق على هذه العملية clone ؟
الرد }}}}
تم الشكر بواسطة: أبو عمر
#3
ممتاز
وللتعرف على مزيد من وظائف نسخ الكائنات
https://en.wikipedia.org/wiki/Object_cop...of_copying
لكني اتساءل عن Effects على موارد النظام في مثل هذه العمليات خصوصا مع الكائنات الكبيرة
تأمل مثلا
Dynamic Class Object
https://msdn.microsoft.com/en-us/library....110).aspx
فأيّ من الوظائف ستكون في المجمل أفضل من الاخرى ؟!
اشكر لك طرح هذا الموضوع لم اتوقع مشاهدته في منتدى عربي للأمانة
الحمدلله نحن معكم نتعلم الكثر
سبحان الله والحمدلله ولا إله إلا الله والله أكبر
 رَبِّ اغْفِرْ لِي وَلِوَالِدَيَّ
Heart
الرد }}}}
تم الشكر بواسطة: الشاكي لله
#4
الأخ الفاضل الشاكي لله

أعتقد انه لا يوجد شئ بدائي او عدم بدائي في كتابة الكود المهم في الأمر ان الكود يخدم احتياجاتك باي طريقة ممكنة و الأهم إن الكود يتم كتابته بشكل صحيح ففي الكود الخاص بك أنت قمت بتعريف متغير يعبر عن Structure ثم اعطيت قيمة لأحد عناصره ثم قمت بتعريف متغير أخر يرمز لنفس Structure ثم قمت بمساواة الاثنان معا

عموما و علي ما اعتقد ما تم استخدامه مع Class يمكن استخدامه مع Structure ففي النهاية الاثنان اساسهم واحد و الفارق بينهما يكمن فقط في نوعية البيانات او في DataTypes لكل منهما  لكن فكرة الحصول علي نسخة منهما ستظل واحدة مع الوضع ف الاعتبار نوعية البيانات طبقا لما شرحته مايكروسوفت في المثال الخاص بها خاصة اذا كانت البيانات من النوع Reference Type


كود :
Public Structure Wallet
   Implements ICloneable

   Public money As Integer
   
   Public Function Clone() As Object Implements ICloneable.Clone
       Return Me.CreateDeepCopy(CreateShallowCopy())
   End Function

   Friend Function CreateShallowCopy() As Wallet
       Return CType(Me.MemberwiseClone(), Wallet)
   End Function

   Friend Function CreateDeepCopy(current As Wallet) As Wallet
       Dim w As Wallet = CType(Nothing, Wallet)
       w.money = current.money
       Return w
   End Function

End Structure

أو يمكن كتابة الكود بشكل مباشر كالأتي:

كود :
Public Structure Wallet
   Implements ICloneable

   Public money As Integer
   
   Public Function Clone() As Object Implements ICloneable.Clone
       Return CType(Me.MemberwiseClone(), Wallet)
   End Function

End Structure


عموما انا الأمر لفت انتباهي ليس إلا لذلك اردت الكتابة عنه ربما يستفيد منه الأخرون

الأخ الفاضل أبو عمر

بما ان DynamicObject Class أساسه Object Class فنفس الاسلوب يسري عليه لكن نأثير هذا علي موارد النظام ف وحده الله اعلم
لكني لا أعتقد إن أخذ نسخة من كلاس ما سيكون له تأثير ما علي موارد نظام التشغيل


كمثال أري أن الفكرة هنا ممكن الاستفادة منها في برامج الداتا بيز مثلا للتعديل علي احد البيانات

و في حالتي انا شخصيا و تحديدا  ف  الكلاس الذي اقوم بكتابته فهي مفيدة لي لتحديد اي تغييرات تحدث بين أول صورة اخذتها لسطح المكتب عن طريق مقارنة اي صورة جديدة بها لمعرفة هل الصورة علي سطح المكتب تتغير بسبب تحريك فورم او فتح برنامج اخر
الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  مقال تقني - سلسلة الكائنات Object Serialization بشكل مجمل RaggiTech 0 381 04-10-12, 11:38 AM
آخر رد: RaggiTech
  Object Initializers من جديد VB2008 RaggiTech 0 264 01-10-12, 06:29 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم