الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كيف تعمل الدالة clone في الجافا

مغلق
بدأه aboShoraih في 17 أغسطس 2006 · 5 رد · 1,352 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

class Equaling implements Cloneable	
{
	  String str;

	public Equaling(String st)
 	{
		   str = st;
		}
	  public String get()
	   {
		 return str;
	   }
	public void set(String st)
	   {
		   str= st;
	   }

	protected Object clone()
		{
		 try
		  {

			Equaling obj = (Equaling)super.clone();   ///  مافائدة عملية الاستدعاء هنا من الصف الاب ولماذا هذا التحويل القسري 

			obj.str = this.str;

			return obj;
		  }

		 catch (CloneNotSupportedException e)
		  {
		   throw new InternalError();
		  }
		}
}

وايضا في صف التجربة كتبنا الكود التالي

public class Test
 {
   public static void main(String arg[])
	{
	  Equaling obj1=new Equaling("first object ");
	  Equaling obj2=new Equaling("second object ");

	  System.out.println("before ");
	  System.out.println("object 1 "+obj1.get());
	  System.out.println("object 2 "+obj2.get()); 

	  obj1=(Equaling)obj2.clone;  /// ما معنى هذا الاسناد 
	  obj1.set("salam alikum ");


	  System.out.println("\nAfter");
	  System.out.println("object 1 "+obj1.get());
	  System.out.println("object 2 "+obj2.get()); 

	} // main

} // class

السؤال موجود ضمن الكود ....

#2

مافائدة عملية الاستدعاء هنا من الصف الاب ولماذا هذا التحويل القسري ؟

فائدة الاستدعاء :

دالة الـclone هنا تقوم بنسخ الـattribute وانشاء اوبجكت جديد

فائدة التحويل القسري :

لأن الـclone implemented from Object class

فهي ترجع نوع Object دائماً ولذلك لابد من عملية التحويل القسري لها .

obj1=(Equaling)obj2.clone; /// ما معنى هذا الاسناد

قمنا بجعل obj1 يحتوي على نفس عناصر obj2 عن طريق الداله clone

لو ترن الكود راح تلاحظ النتايج وتقيسها على عمل الداله CLONE اللتي تقوم بانشاء اوبجكت من عناصره الأساسيه

#3

جزاك الله خيرا اخي عيسى ...

لكن سؤالي الاول هو لماذا الاستدعاء من الصف الاب ... طالما انه لم يرث اي صف اب ... اضف الى ذلك ان الصف الاب افتراضيا هو Object والذي لا يملك اي attributes لكي ينسخها ...

فلماذا لا يكفي ان انشئ غرض من الصف الحالي واسند له قيم هذا الغرض ... كما هو في الشكل ...:

Equaling obj=new Equaling();
obj.str=this.str;

وهنا ايضا لدي سؤال آخر لماذا نوع او نمط الاعادة هو من نوع object الا يصح ان اجعله من الصف الذي يحقق هذه الدالة ... مثل الترويسة ..:

protected Equaling run()
{
   ................
 }
#4
protected Equaling run()
{
   ................
}

إذا كنت تقصد

protected Equaling clone()
{
   ................
}

فهنا أنت تقوم بعمل override للدالة clone التي تعيد أصلاً Object .. وهذا صحيح في jdk1.5 فقط .. لأن Equaling يرث الصف Object

اقتباس
فلماذا لا يكفي ان انشئ غرض من الصف الحالي واسند له قيم هذا الغرض ... كما هو في الشكل ...:

هذه الدالة تعمل بهذا الشكل .. اسأل sun لماذا... والمبرمجون لا يحبذون استخدامها..

فحنوت ألثم جرحه الرعافَ فانتكأت جراحي..

وهمت على خدي الدموع فقلت يا روحي وراحي..

هلّا رحمتَ قلوبنا .. وعدلت عن هذا الرّواحِ ِ ..؟

فأجابني البطل المسجّى هازئاً بيَ .. باقتراحي

كفكف دموعك ليس في عبراتك الحرّى ارتياحي

هذي سبيلي .. إن صدقت محبتي .. فاحمل سلاحي

Sun Certified Java Programmer

#5

شكرا عمو اياد ...

لكن هنا اقوم ب overloading وليس overriding ....

لانه لا يصح في حالة overriding ان اغير نمط الاعادة ...

هذا اولا ... اما ثانيا ... ما المشكلة التي ستحصل ان فعلت كما هو في الكود السابق ... يعني overloading

للدالة clone .... ليصبح نمط الاعادة من نفس نوع الصف وليس من الصف object ؟؟؟

#6

أهلاً أبو شريح ..

هذا overriding وليس overloading

حيث أننا لم نغير الparameter الممررة للميثود

في الحالة الثاني كما كتبت أنت في المثال.. انت أسميت الدالة run أي غيرت اسمها .. فهنا ليس overloading ولا overriding وإنما ميثود جديدة

يصح ان تغير نمط الإعادة إلى Equaling بدلاً من Object كما قلت .. وهذا OVERRIDING ولا يصح إلا في JDK1.5

فحنوت ألثم جرحه الرعافَ فانتكأت جراحي..

وهمت على خدي الدموع فقلت يا روحي وراحي..

هلّا رحمتَ قلوبنا .. وعدلت عن هذا الرّواحِ ِ ..؟

فأجابني البطل المسجّى هازئاً بيَ .. باقتراحي

كفكف دموعك ليس في عبراتك الحرّى ارتياحي

هذي سبيلي .. إن صدقت محبتي .. فاحمل سلاحي

Sun Certified Java Programmer

هذا الموضوع مغلق.

مواضيع مشابهة