• 0
GoJava

طلب شرح موضوع Dynamic Method Dispatch

سؤال

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

كيف الحال جميعا 

في موضوع لم افهمه جيدا 

مثلا يوجد لدينا كلاس اسمه First وفي داخله ميثود تطبع First 

يوجد لدينا كلاس ثاني اسمه Second يرث من كلاس First ويوجد في داخله ميثود Overriding للميثود التي تطبع First لكن نحن نطبع محلها Second 

كما قرات سابقا انه كلاس الاب لايعرف شيئ عن كلاس الابن 

شاهد الكود التالي : 

 

class First{int x,y;void show(){System.out.println("First ");}}class Second extends First{void show(){System.out.println("Second ");}}class ShowInfo{public static void main(String [] args){First f = new First();Second s = new Second();First b;b = f;b.show();b=s;b.show();}}

 

نلاحظ هنا في هذا الجزء 

 

b = f;b.show();

 

قمنا باسناد اوبجكت f الى b بعدين قلنا له في السطر التالي اظهر لنا ميثود show 

 

المشكله لدي بالسطر التالي :

 

 

b=s;b.show();

 

 

 

اسندنا اوبجكت من الكلاس الابن الى اوبجكت من كلاس الاب وطبع ميثود كلاس الابن Second 

كيف تم هذا الامر ياريت توضيحه بشكل مفصل 

 

جزاكم الله خير 

 

 

 

 

 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

10 إجابة على هذا السؤال .

  • 0

هذا يحدث لأن تنفيذ الدوال على الكائنات (إستدعاء الدوال التي بداخل الكائنات) يحدث وقت التنفيذ (at runtime).

و أثناء وقت التنفيذ تعرف ال JVM أن الكائن المعرف من نوع ال Parent يحتوي فعليا على كائن من نوع ال Child ...

و بالتالى عند إستداء أي دوال على ال child تقوم ال JVM بالبحث عن هذه الداله في الكائن ال Child ...

 

للمزيد:

http://en.wikipedia.org/wiki/Virtual_method_table

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

كل دوال الــJava هي دوال ظاهريه Virtual methods يتم استدعاءها حسب نوع الكائن وليس حسب نوع الــ reference ، متى يكون هناك تاثير لنوع الــ Reference ؟؟ في حالة الــ overloading

 

القاعدة تقول :

 

Overriding -->Object

Overloading --> Reference

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزاكم الله خير يااحبه 

المشكله عند دراسه الوراثه اخذنا انه الاب لايعرف شيئ عن الكلاس الابن 

جزاكم الله خير على توضيح 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

المشكله عند دراسه الوراثه اخذنا انه الاب لايعرف شيئ عن الكلاس الابن 

صحيح مئه بالمئه ... و غير ذلك يكون التصميم به شئ خطأ

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

صحيح مئه بالمئه ... و غير ذلك يكون التصميم به شئ خطأ

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

وفي حال قمنا بحذف الوراثه لن يعمل البرنامج يعطينا خطأ 

نتمنى توضيح اكثر وكيف يتم الامر في الميموري حتى لو برسمه بسيطه 

لو قمنا بعمل كلاس عادي وفيه ميثود وغيره وكلاس ثاني عادي وفيه ميثود وغيره وعملنا اوبجكت من كل كلاس نفس المثال السابق بدون وراثه كلاسات 

راح يعطينا خطأ 

انا هنا اريد ان اوصل كيف سوبر استطاع الوصول لابنه وابنه اساسا مخبي اسراره عن ابوه  :lol:

شكرا لكم جميعا 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

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

وفي حال قمنا بحذف الوراثه لن يعمل البرنامج يعطينا خطأ 

نتمنى توضيح اكثر وكيف يتم الامر في الميموري حتى لو برسمه بسيطه 

لو قمنا بعمل كلاس عادي وفيه ميثود وغيره وكلاس ثاني عادي وفيه ميثود وغيره وعملنا اوبجكت من كل كلاس نفس المثال السابق بدون وراثه كلاسات 

راح يعطينا خطأ 

انا هنا اريد ان اوصل كيف سوبر استطاع الوصول لابنه وابنه اساسا مخبي اسراره عن ابوه  :lol:

شكرا لكم جميعا 

 

اعتقد ان هويدي يتكلم عن مبدأ الــ loose coupling !

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم و رحمة الله  :-)

أخي العزيز...

هناك ثلاث حالات لاستدعاء الميثود في الوراثة باستخدام خاصية (substitutabiliy) و هي خاصية ان يكون نوع الاوجكت من نوع كلاس اب , بينما يكون التعريف من نوع كلاس ابن مثل :

 

 

First f = new First();
Second s = new Second();
First b;
b = f;
b.show();
b=s;
b.show();

 

كما قمت انت :

الحالة الاولي :

ان تكون الدالة المستدعاه موجودة فقط في الكلاس الاب و في هذه الحالة سيقوم الcompiler باستدعائها و تنفيذها مباشرة

 

الحالة الثانبة :

ان تكون الدالة موجوده في الاب و الابن و في هذه الحالة سيتم تنفيذ الدالة الموجودة في الكلاس الابن

 

الحالة الثالثة :

ان تكون الدالة موجودة في كلاس الابن فقط !! و في هذه الحالة الاخيرة سيحدث ساينتاكس ايرور

 

( اعني بكلممة موجودة ان تكون مذكورة سواء حدثت لها عملية overide ام لم تحدث)

 

و شكرا

تم تعديل بواسطه Aseer Alsamt
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم و رحمة الله  :-)

أخي العزيز...

هناك ثلاث حالات لاستدعاء الميثود في الوراثة باستخدام خاصية (substitutabiliy) و هي خاصية ان يكون نوع الاوجكت من نوع كلاس اب , بينما يكون التعريف من نوع كلاس ابن مثل :

 

 

First f = new First();

Second s = new Second();

First b;

b = f;

b.show();

b=s;

b.show();

 

كما قمت انت :

الحالة الاولي :

ان تكون الدالة المستدعاه موجودة فقط في الكلاس الاب و في هذه الحالة سيقوم الcompiler باستدعائها و تنفيذها مباشرة

 

الحالة الثانبة :

ان تكون الدالة موجوده في الاب و الابن و في هذه الحالة سيتم تنفيذ الدالة الموجودة في الكلاس الابن

 

الحالة الثالثة :

ان تكون الدالة موجودة في كلاس الابن فقط !! و في هذه الحالة الاخيرة سيحدث ساينتاكس ايرور

 

( اعني بكلممة موجودة ان تكون مذكورة سواء حدثت لها عملية overide ام لم تحدث)

 

و شكرا

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

حياك الله اخي 

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

انا سؤالي كيف اوبجكت من كلاس الاب عرف في الميثود والتي هي اساسا اوف لودينج انها موجوده في الابن ؟ 

هذا هو سؤال 

لانه وقت دراسه انه الاب لايعرف شي عن الابن وحط تحت شي خط حمر 

كيف هنا فهم JVM انه يروح للكلاس الابن ويستدعي الميثود ليش ماعطانا خطأ 

هل لانه الميثود اوفر لودينج في الكلاسات الاثنين وJVM فهم هذا شي ؟ 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ايوة فهمتك اخي

 

طبعا !!
الjvm بعرف انها افر لودنج في الكلاسين و دي الحالة الثانية اللي ذكرتها في البداية اخي

و لو لاحظت انه نفذ الدالة الموجودة في الابن

 

شكرا

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

جزاك الله خير 

وضحت الامور كويس الان 

بارك الله فيكم 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .