هناك ثلاث ميزات رئيسية للموجهة نحو الكائن: التغليف ، الميراث ، تعدد الأشكال. من منظور معين ، يتم إعداد التغليف والميراث تقريبًا تقريبًا للتعدد متعدد الأشكال. هذا هو مفهومنا الأخير وأهم نقطة معرفة.
1. التعريف:
تعدد الأشكال: يشير إلى السماح للكائنات من أنواع مختلفة بالاستجابة لنفس الرسالة. أي أن نفس الرسالة يمكن أن تعتمد مجموعة متنوعة من السلوكيات المختلفة وفقًا للكائنات المختلفة المرسلة. (إرسال رسالة هي مكالمة دالة)
2. تسمى التكنولوجيا التي تنفذ تعدد الأشكال: الربط الديناميكي ، والذي يشير إلى الحكم على النوع الفعلي للكائن المشار إليه أثناء التنفيذ واستدعاء طريقته المقابلة وفقًا لنوعه الفعلي.
3. الوظيفة: القضاء على علاقة الاقتران بين الأنواع.
4. في الواقع ، هناك أمثلة لا حصر لها من تعدد الأشكال. على سبيل المثال ، الضغط على مفتاح F1 ، إذا ظهر مستند AS3 Help حاليًا تحت واجهة الفلاش ؛ إذا كانت كلمة المساعدة قد ظهرت حاليًا تحت الكلمة ؛ إذا كانت مساعدة Windows قد ظهرت حاليًا تحت مساعدة ودعم Windows. يحدث الحدث نفسه على كائنات مختلفة وينتج نتائج مختلفة.
5. فيما يلي ثلاثة شروط ضرورية للوجود متعدد الأشكال ، والتي تتطلب من الجميع حفظه عند الحلم!
ثلاثة شروط ضرورية للتعدد الأشكال
1. يجب أن يكون هناك ميراث.
2. يجب إعادة كتابة.
3. يشير مرجع الفئة الأم إلى كائن فئة الطفل.
6. فوائد تعدد الأشكال:
1) قابلية الاستبدال: تعدد الأشكال له قابلية للتبادل للرمز الحالي. على سبيل المثال ، يعمل تعدد الأشكال على فئة دائرة الدائرة ، ويعمل أيضًا على أي هندسة دائرية أخرى ، مثل الدائرة.
2) التوسيع: تعدد الأشكال قابلة للتمديد للرمز. لا تؤثر إضافة فئات فرعية جديدة على تشغيل وتشغيل تعدد الأشكال والميراث والميراث والخصائص الأخرى. في الواقع ، من الأسهل الحصول على وظائف متعددة الأشكال عن طريق إضافة فئات فرعية جديدة. على سبيل المثال ، على أساس إدراك تعدد الأشكال للأقماع ، والنصاف ونصف الكرة ، من السهل إضافة تعدد الأشكال من المجالات.
3) القدرة على الواجهة: يتم تحقيق تعدد الأشكال بواسطة فئات فائقة من خلال توقيعات الأسلوب ، وتوفير واجهة مشتركة للفئات الفرعية ، ويتم تنفيذ الفئات الفرعية عن طريق تحسينها أو الكتابة فوقها. كما هو مبين في الشكل 8.3. في الشكل ، يحدد شكل الفئة الفائقة طريقتين للواجهة اللذين ينفذان تعدد الأشكال ، الحوسبة () و computevolume (). الفئات الفرعية ، مثل الدائرة والكرة ، تحسين أو تجاوز هاتين الواجهة من أجل تحقيق تعدد الأشكال.
4) المرونة: يعكس عمليات مرنة ومتنوعة في التطبيق ويحسن كفاءة الاستخدام.
5) البساطة: تعدد الأشكال يبسط عملية كتابة البرامج وتعديل برامج التطبيق ، خاصة عند التعامل مع عمليات وعمليات عدد كبير من الكائنات ، هذه الميزة بارزة ومهمة بشكل خاص.
رمز قضية القط والكلب
Class Animal {public void eat () {system.out.println ("eat") ؛} public void sleep () {system.out.println ("sleep") ؛}} class class extens {public void eat () {system.out.println ("dog eat meat") ؛} public void sleep () يمتد Animal {public void eat () {system.out.println ("Cat Eats Fish") ؛} public void sleep () {system.out.println ("Cat sleeps on tummy") ؛}} pig class Explic {system.out.println ("Pig Sleeps on Side") ؛}} // فئة الأدوات لفئة العمليات الحيوانية ANTALLTOOL {private AnimalTool () {}/* // calls cat's function public static usecat (cat c) {c.eat () ؛ C.Sleep () ؛ }. D.Sleep () ؛ } // استدعاء وظيفة Pig's Public static void usepig (pig p) {p.eat () ؛ p.sleep () ؛ } */public static void useanimal (Animal a) {A.Eat () ؛ A.Sleep () ؛} // فئة جميع الاحتمالات في الحيوانات} class duotaidemo2 {public static void main (string []] cat () ؛ c2.eat () ؛ c2.sleep () ؛ // أحب القطط على وجه الخصوص ولدي قطة أخرى c3 = cat new () ؛ c3.eat () ؛ استدعاء الطريقة ، ألا تعتقد أنها مشابهة جدًا؟ إنه فقط أن أسماء الكائنات مختلفة. // نخطط لاستخدام طرق لتحسين // استدعاء طريقة لتحسين الإصدار // usecat (c) ؛ // usecat (c2) ؛ // usecat (c3) ؛ // animaltool.usecat (c) ؛ // animaltool.usecat (c2) ؛ // animaltool.usecat (c2) ؛ // animaltool.usecat ( C3) ؛ AnimalTool.Useanimal (C2) ؛ AnimalTool.Useanimal (C2) ؛ AnimalTool.Useanimal (c3) ؛ system.out.println ("-------------------------") ؛ // i مثل الكلاب الكلاب D = New Dog () ؛ Dog D2 = New Dog () ؛ Dog D3 = جديد dog () ؛ // animaltool.usedog (d) ؛ // animaltool.usedog (d2) ؛ // animaltool.usedog (d3) ؛ AnimalTool.Useanimal (d) ؛ AnimalTool.Useanimal (d2) ؛ AnimalTool.useanimal ( d2) ؛ AnimalTool.Useanimal (d3) ؛ system.out.println ("---------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ pig () ؛ // animaltool.usepig (p) ؛ // animaltool.usepig (p2) ؛ // animaltool.usepig (p3) ؛ AnimalTool.Useanimal (p2) ؛ AnimalTool.Useanimal (p2) ؛ AnimalTool.useanimal (p3) ؛ system.out.println ("---------------------------------------- Leopard ... الفراغ الثابت (cat c) {c.eat () ؛7. طريقة تنفيذ تعدد الأشكال في Java: تنفيذ الواجهة ، ورث الفئة الأصل لإعادة كتابة الطريقة ، وطرق التحميل الزائد في نفس الفصل.
8. تصنيف الأشكال المتعددة في جافا:
في Java ، يمكن تقسيم الأشكال المتعددة تقريبًا إلى المواقف التالية:
1) الشخص هو فئة الوالدين والطالب هو فصل الطفل. ثم: personp = newStudent () ؛
2) Fliable هي واجهة والطيور هي فئة تنفذ الواجهة ، لذلك: fliabilityf = newbird () ؛
3) Fliable هو فئة مجردة ، Bird هو فئة ترث Fliable ، لذلك: fliablef = newbird () ؛
عندما تعدد الأشكال ، من الضروري أن نذكر أن P تعلن كإشارة إلى فئة الوالدين ، لكنها في الواقع إشارة إلى فئة الطفل. لكنه يمكنه فقط استدعاء الأساليب في فئة الأصل. إذا تجاوزت الطريقة في الفئة الفرعية طريقة الفئة الأصل ، فسيتم استدعاء طريقة الفئة الأصل (استدعاء الطريقة الافتراضية). وينطبق الشيء نفسه على تعدد الأشكال. ربما ستسأل ، إذا كانت F تريد استدعاء طريقتها الخاصة ، ألا يرتكب ذلك خطأ؟ في الواقع ، هذه أيضًا تغطية طريقة ، لأن الفئة الفرعية التي تنفذ الواجهة ستنفذ بالتأكيد الأساليب في الواجهة ، لذلك في هذه الحالة تسمى الطريقة في الطيور. ولكن إذا كان لدى الطيور طريقة لم يتم تعريفها في الواجهة ، فلا يمكن استدعاء F.
9.InstanceOf Operator:
تتسبب الآلية متعددة الأشكال للغة Java في عدم وجود نوع إعلان المتغير المرجعي غير متوافق مع نوع الكائن المرجعي الفعلي. إلى جانب قواعد استدعاء الطريقة الافتراضية ، يمكننا أن نستنتج أن متغيرين مرجعيين أُعلن أنهما نفس النوع قد يكون لهما سلوكيات مختلفة عند استدعاء نفس الطريقة. يتم تقديم مشغل مثيل من هنا.
لذلك إذا أعلنت personp = newStudent () ؛ هل يمكنني تحويل p إلى الطالب؟ بالطبع ، يمكن القيام بذلك ، ولكن يجب إجباره (الابن يريد أن يكون أبًا وسيأتي مباشرة ، ولكن إذا أراد الأب أن يكون ابنًا ، فسيتم إجباره).
عادة ، تتم إضافة مثيل عند الصب.
if (pinstanceofstudent) {students = (student) p ؛}
تعدد الأشكال يمر عبر تعلم جافا بأكمله. على سبيل المثال ، عند كتابة عبارات الصيد عند التعامل مع الاستثناءات ، ننص على أنه يجب كتابة استثناءات الفئة الفرعية في استثناءات الفئة الأمامية والوالدين في الخلف. لماذا؟ السبب هو تعدد الأشكال. تنسيق بيان الصيد لدينا: catch (استثناء). عند إنشاء استثناء ، سيقوم برنامج Java تلقائيًا بإنشاء كائن استثناء. إذا تم إنشاء استثناء من فئة الطفل أولاً وتم كتابة استثناء فئة الوالدين في المقدمة ، فسيتم تنفيذ بيان الصيد هذا بالتأكيد وفقًا لتعدد الأشكال ، وسيقفز بعد تنفيذ بيان الصيد.
10. مثال:
على الرغم من أنني لا أفهم تعدد الأشكال في Java جيدًا ، فإن المثال التالي يجعلني أفهم بعضًا:
Class A {public string show (d obj) .. {return ("a and d") ؛} عرض السلسلة العامة (a obj) .. {return ("a and a") ؛}} class B يمتد A {public string show (b obj) .. {return ("b and b") ؛ B {} class e {public static void main (string [] args) {a a1 = new a () ؛ a2 = new b () ؛ b b = new b () ؛ c c = new c () ؛ d d = new = d () ؛ system.out.println (a1.show (b)) ؛ // ①system.out.println (a1.show (c)) ؛ // ②system.out.println (a1.show (d)) ؛ //③system.out.println(a2.show(b)) ؛//④system.out.println ( ⑥system.out.println (B.Show (B)) ؛ // ⑦system.out.println (B.Show (C)) ؛ // ⑧system.out.println ((3) الإجابة
① A و A ② A و A ③ A و D ④ B و A ⑤ B و A ⑥ A و D ⑦ B و B ⑧ B و B ⑨ A و D
**** هناك إجابة شخص جيد ****
هناك نقطتان رئيسيتان لهذه المشكلة:
أحدهما هو العلاقة بين الفئة الفرعية والفئة الأم ، والآخر هو مسألة استدعاء الأساليب الزائدة.
يمكن استخدام كائنات الفئة الفرعية مباشرة ككائنات أولية ، ولكن على خلاف ذلك ، لا يمكنها ذلك. على سبيل المثال ، الأشخاص هم فئة الوالدين والطلاب هم الفئة الفرعية للأشخاص ، لذلك يجب أن يكون للكائنات الطلابية سمات الأشياء البشرية ، ولكن قد لا يكون للكائنات البشرية بالضرورة خصائص كائنات الطلاب. لذلك ، يمكن استخدام كائنات الطلاب ككائنات بشرية ، ولكن لا يمكن استخدام الأشياء البشرية ككائنات طالب. لاحظ أنه عند استخدام كائن الفئة الفرعية ككائن الأصل ، سيفقد كائن الفئة الفرعية جميع خصائص الفئة الفرعية ويحتفظ فقط بالسمات والأساليب بنفس الاسم مثل فئة الأصل (نفس طريقة الاسم ليست فقط اسم الوظيفة ، ولكن أيضًا يجب أن يكون نوع المعلمة هو نفسه ، وإلا فلن يتم الاحتفاظ به).
إذا تم تعريف طريقة محملة بشكل زائد في فئة ، فسيقوم النظام تلقائيًا بتحديد الطريقة المناسبة واتصالها وفقًا لنوع المعلمة عند استدعاء الطريقة.
1) A1.Shows (B) ، لا توجد طريقة تحتوي على معلمات الفئة B في A ، ولكن يتم استدعاء طريقة تحتوي على معلمات الفئة A وفقًا لمبدأ أن الفئة الأصل لكائن الفئة الفرعية متوفرة ، لذلك تسمى الطريقة.
publicStringshow(Aobj)...{return("AandA");}
2) A1.Show (C) ، الفئة C هي فئة فرعية من الفئة B ، والفئة B هي فئة فرعية من الفئة A ، لذلك يمكن استخدام كائنات الفئة C ككائن من الفئة A. والنتيجة هي نفسها على النحو الوارد أعلاه.
3) A1.Show (D) ، اتصل مباشرة بالطريقة في A وفقًا لنوع المعلمة
publicStringshow(Dobj)...{
return("AandD");}
4) a2.show (b) ، كان A2 في الأصل كائن B ، ولكن تم تعيينه لمتغير الفئة A ، لذلك يحتفظ A2 فقط بالخصائص والأساليب بنفس اسم الفئة الأصل A. A2
public String show(A obj)...{
return ("B and A");
}
5) A2.Show (C) ، لا تحتوي الطريقة المحجوزة على الفئة B
public String show(A obj)...{
return ("B and A");
}
أعتقد أن هذا التفسير أكثر منطقية: كان A2 في الأصل كائنًا من الفئة B ، ولكن تم تعيين القيمة إلى الفئة A ، C هي فئة فرعية من B ، و B هي فئة فرعية لـ A ، لذلك يحتفظ A2 بالخصائص والأساليب في الفئة B بنفس اسم A.
6) A2.show (د) ، المكالمة من الفئة أ
public String show(D obj)...{
return ("A and D");
}
7) B.Show (ب) ، اتصل
public String show(B obj)...{
return ("B and B");
}
8) B.Show (C) ، لا توجد طريقة مع معلمة C في الفئة B ، ولكن هناك طريقة مع المعلمة B ، لذلك تسمى الطريقة
public String show(B obj)...{
return ("B and B");
}
9) B.Show (D) ، التفسير هو نفس 8
لخص
ما سبق هو المحتوى الكامل لملخص هذا المقال عن تعدد الأشكال Java ، وآمل أن يكون ذلك مفيدًا للجميع. إذا كان لديك أي أسئلة ، فيرجى ترك رسالة في أي وقت ونتطلع إلى تعليقاتك القيمة!