الانتقال إلى المحتوى الرئيسي

تعدد الأشكال الديناميكي: ما هو وكيف يعمل

  • المهندسة سلاف قبيلة هذيل البقوم
  • الأسئلة

تعدد الأشكال الديناميكي هو أحد المفاهيم الأساسية في البرمجة الشيئية. يسمح لك بإنشاء واستخدام كائنات من أنواع مختلفة من خلال واجهة مشتركة ، مما يجعل الشفرة أكثر مرونة وقابلة لإعادة الاستخدام.

تعدد الأشكال يعني أنه يمكن إجراء نفس العملية على كائنات من فئات مختلفة. على سبيل المثال ، لدينا فئتا "الدائرة" و "المستطيل" ، ولكل من هاتين الفئتين طريقة "حساب المنطقة". عند استخدام تعدد الأشكال ، يمكننا استدعاء هذه الطريقة للكائنات من كلا الفئتين دون معرفة نوع الكائن المحدد.

لتنفيذ تعدد الأشكال الديناميكي ، تستخدم معظم لغات البرمجة آلية الوظائف الافتراضية (أو الأساليب). هذا يعني أن كل فئة تحدد الوظائف الافتراضية التي يمكن تجاوزها في الفئات اللاحقة. عند استدعاء دالة افتراضية عبر مؤشر أو مرجع إلى الفئة الأساسية ، سيتم تنفيذ الطريقة المحددة في الفئة الفرعية ، إذا كان هناك مثل هذه الطريقة.

  1. تعريف تعدد الأشكال الديناميكي
  2. الفرق بين تعدد الأشكال الثابت والديناميكي
  3. المفاهيم الأساسية لتعدد الأشكال الديناميكي
  4. مزايا استخدام تعدد الأشكال الديناميكي
  5. كيف يعمل تعدد الأشكال الديناميكي في لغة البرمجة
  6. أمثلة على استخدام تعدد الأشكال الديناميكي
  7. مثال 1: السلوك متعدد الأشكال عند العمل مع الأشكال الهندسية
  8. مثال 2: السلوك متعدد الأشكال عند العمل مع الأعداد المركبة
  9. ما هي الوظائف الافتراضية وكيف ترتبط بتعدد الأشكال الديناميكي
  10. سؤال وجواب
  11. ما هو تعدد الأشكال الديناميكي?
  12. كيف يعمل تعدد الأشكال الديناميكي?
  13. ما هي مزايا استخدام تعدد الأشكال الديناميكي?

تعريف تعدد الأشكال الديناميكي

تعدد الأشكال الديناميكي هو أحد المفاهيم الأساسية للبرمجة الموجهة للكائنات ، والتي تسمح للكائنات من فئات مختلفة أن يكون لها نفس السلوك عند استدعاء نفس الطريقة.

يعني التعبير" ديناميكي " أن القرار بشأن الطريقة المحددة التي سيتم استدعاؤها يتم اتخاذه أثناء تنفيذ البرنامج ، وليس في مرحلة التجميع. وهذا يوفر قدرا أكبر من المرونة والقدرة على تغيير سلوك البرنامج دون الحاجة إلى تغيير التعليمات البرمجية الخاصة به.

لتنفيذ تعدد الأشكال الديناميكي في لغات البرمجة ، يتم استخدام آلية الوظائف الافتراضية (أو الأساليب). الدالة الافتراضية هي دالة معلنة في فئة أساسية وأعيد تعريفها في فئتها المشتقة.

عندما يتم استدعاء دالة افتراضية بواسطة مؤشر أو مرجع إلى الفئة الأساسية ، سيتم تنفيذ الإصدار المقابل المعاد تعريفه من الوظيفة من الفئة المشتقة. وبالتالي ، يمكن تحديد سلوك الطريقة أثناء تنفيذ البرنامج ، اعتمادا على نوع الكائن الذي يشير إليه المؤشر أو المرجع.

نتيجة لتعدد الأشكال الديناميكي ، يصبح الرمز أكثر مرونة وقابلية للتوسيع والصيانة. يسمح لك بالتجريد من أنواع معينة من الكائنات والبرنامج بمستوى أعلى من التجريد ، مما يساعد على زيادة كفاءة تطوير البرامج.

الفرق بين تعدد الأشكال الثابت والديناميكي

تعدد الأشكال الثابت والديناميكي هما النوعان الرئيسيان لتعدد الأشكال المستخدم في البرمجة. يسمح لك كلا النوعين باستخدام نفس الواجهة لأنواع البيانات المختلفة ، ولكن لديهم بعض الاختلافات المهمة.

تعدد الأشكال الثابت هو شكل من أشكال تعدد الأشكال الذي يتم حله أثناء تجميع البرنامج. هذا يعني أن القرار بشأن الطريقة أو الوظيفة التي سيتم استدعاؤها يتم اتخاذه بناء على نوع البيانات المستخدم عند استدعاء الطريقة أو الوظيفة. مثال على تعدد الأشكال الثابت هو التحميل الزائد للوظيفة أو المشغل ، عند استخدام نفس الطريقة أو اسم الوظيفة لمعلمات أو معاملات مختلفة.

على سبيل المثال ، لدينا فئة "الشكل" ، والطبقات "دائرة" ، "مستطيل" ، "مثلث" موروثة منه. كل فئة لديها طريقة" مربع". باستخدام تعدد الأشكال الثابت ، يمكننا إنشاء طريقة "منطقة" محملة بشكل زائد تقبل أنواع البيانات المختلفة (دائرة ، مستطيل ، مثلث) وتعيد المنطقة المقابلة.

تعدد الأشكال الديناميكي هو شكل من أشكال تعدد الأشكال الذي يتم حله أثناء تنفيذ البرنامج. هذا يعني أن القرار بشأن الطريقة أو الوظيفة التي سيتم استدعاؤها يتم اتخاذه بناء على نوع البيانات الفعلي المستخدم في وقت التشغيل. في لغات البرمجة التي تدعم البرمجة الشيئية ، يتم تحقيق تعدد الأشكال الديناميكي باستخدام وظائف افتراضية.

على سبيل المثال ، لدينا فئة أساسية "الشكل" ، والفئات "الدائرة" ، "المستطيل" ، "المثلث" موروثة منه. كل فئة لها طريقة" مربع " ، والتي يتم الإعلان عنها على أنها افتراضية في الفئة الأساسية. عند استدعاء طريقة" المنطقة " على كائن من الفئة الأساسية ، سيتم استدعاء الطريقة المقابلة بناء على النوع الفعلي للكائن.

في تعدد الأشكال الديناميكي ، يتم اتخاذ القرار بشأن الطريقة أو الوظيفة التي سيتم استدعاؤها بناء على جدول افتراضي (الجدول الخامس) أو جدول الوظائف الافتراضية التي يتم إنشاؤها عند إنشاء كائن. أثناء التنفيذ ، يستخدم البرنامج مؤشرا إلى كائن للوصول إلى الجدول الصحيح للوظائف الافتراضية واستدعاء الطريقة المطلوبة.

المفاهيم الأساسية لتعدد الأشكال الديناميكي

تعدد الأشكال الديناميكي هو مفهوم برمجة موجه للكائنات يسمح للكائنات من فئات مختلفة باستخدام نفس الوظيفة أو الطريقة مع تطبيقات مختلفة.

المفاهيم الأساسية لتعدد الأشكال الديناميكي هي:

  1. وظائف افتراضية. الوظائف الافتراضية هي وظائف معلنة في الفئة الأساسية ويتم تجاوزها في الفئة المشتقة. أنها تسمح للكائنات من فئات مختلفة للوصول إلى وظيفة بنفس الاسم ، ولكن مع تطبيقات مختلفة. لإنشاء وظيفة افتراضية ، يجب عليك استخدام الكلمة الأساسية الافتراضية عند الإعلان عن الوظيفة في الفئة الأساسية.
  2. الربط المتأخر. الربط المتأخر (يسمى أيضا الربط الثابت المتأخر) هو آلية يتم فيها اختيار تنفيذ معين لوظيفة افتراضية أثناء تنفيذ البرنامج. نتيجة لذلك ، يمكن للكائنات من فئات مختلفة استدعاء نفس الوظيفة الافتراضية ، مع الحصول على تنفيذها الخاص.
  3. الطبقة الأساسية والطبقة المشتقة. الفئة الأساسية هي فئة يتم فيها الإعلان عن وظيفة افتراضية. الفئة المشتقة (وتسمى أيضا فئة فرعية) هي فئة ترث من فئة أساسية وتتجاوز وظيفة افتراضية.
  4. الربط المبكر. الربط المبكر (يسمى أيضا الربط الثابت) هو آلية يتم فيها اختيار تنفيذ وظيفة معينة في مرحلة التجميع من البرنامج. ونتيجة لذلك ، فإن الكائنات من فئات مختلفة استدعاء نفس الوظيفة والحصول على نفس التنفيذ.

تشكل كل هذه المفاهيم معا الأساس لعمل تعدد الأشكال الديناميكي في البرمجة الشيئية. بفضل تعدد الأشكال الديناميكي ، يمكن للمبرمجين كتابة كود مرن وقابل للتوسيع يسمح للكائنات من فئات مختلفة باستخدام نفس الواجهة ومعالجة البيانات في سياقات مختلفة.

مزايا استخدام تعدد الأشكال الديناميكي

1. المرونة

تتمثل إحدى المزايا الرئيسية لتعدد الأشكال الديناميكي في القدرة على إنشاء كود أكثر مرونة وتكيفا. يمكن استخدام الكائنات متعددة الأشكال في سياقات مختلفة دون تغيير الكود نفسه. هذا يجعل من السهل تغيير أو إضافة وظائف جديدة دون التأثير على التعليمات البرمجية الموجودة ، والتي بدورها تبسط صيانة البرامج.

2. راحة التفاعل بين الأشياء

يسمح تعدد الأشكال الديناميكي للكائنات من فئات مختلفة بالعمل معا من خلال واجهة مشتركة أو فئة أساسية. هذا يبسط إلى حد كبير التفاعل بين الكائنات من أنواع مختلفة ، لأنه من الضروري معرفة الواجهة العامة فقط ، وليس تفاصيل التنفيذ لكل فئة.

3. التمدد

باستخدام تعدد الأشكال الديناميكي ، يمكنك بسهولة إضافة فئات أو طرق جديدة إلى برنامج دون التأثير على التعليمات البرمجية الموجودة. يسمح هذا للمبرمج بإنشاء بنية معيارية حيث يكون كل جزء من البرنامج مسؤولا فقط عن مهامه ويمكن تعديله أو استبداله بسهولة.

4. تبسيط التجريد

يتيح لك تعدد الأشكال الديناميكي إنشاء تجريدات يمكنها العمل مع أنواع مختلفة من البيانات دون الحاجة إلى معرفة تنفيذها المحدد. على سبيل المثال ، يمكن كتابة خوارزمية الفرز للعمل مع أي أنواع بيانات تدعم المقارنة. وهذا يجعل رمز أكثر تنوعا وقابلة لإعادة الاستخدام.

5. قراءة التعليمات البرمجية

استخدام تعدد الأشكال الديناميكي يجعل الكود أكثر قابلية للقراءة والفهم. يمكن دمج الكائنات التي تشترك في نفس السلوك في تجريد واحد ، مما يؤدي إلى إنشاء بنية رمز أكثر منطقية. بالإضافة إلى ذلك ، يتيح لك استخدام الأساليب متعددة الأشكال إنشاء تعبيرات واضحة وموجزة ، مما يسهل فهم الكود والحفاظ عليه.

كيف يعمل تعدد الأشكال الديناميكي في لغة البرمجة

تعدد الأشكال الديناميكي هو أحد المفاهيم الأساسية للبرمجة الشيئية. يسمح لك باستخدام نفس الطريقة أو الوظيفة لكائنات من فئات مختلفة ، بشرط أن ترث من نفس الفئة الأساسية أو تنفذ نفس الواجهة.

لفهم كيفية عمل تعدد الأشكال الديناميكي ، من الضروري فهم بعض المفاهيم الأساسية.

  • الفئة الأساسية هي فئة ترث منها الفئات الأخرى. يحدد الخصائص والأساليب المشتركة التي يمكن استخدامها من قبل جميع ورثتها.
  • الوريث هو فئة ترث خصائص وطرق فئة أساسية. يمكنه إضافة خصائصه وطرقه الخاصة ، وكذلك تجاوز طرق الفئة الأساسية.
  • الطريقة هي إجراء أو وظيفة يمكن استدعاؤها على كائنات فئة. يمكن تجاوز الطرق في الورثة.
  • تعدد الأشكال هو قدرة الكائنات التي لها نفس الواجهة على تنفيذ طرق مختلفة في فصولها.

دعونا نلقي نظرة على مثال لتمثيل مرئي أكثر:

فئة الحيوان {

صوت السلسلة العامة () {

عودة "الحيوان يجعل الصوت";

}

}

فئة القط يمتد الحيوان {

صوت السلسلة العامة () {

عودة "مواء";

}

}

فئة الكلب يمتد الحيوان {

صوت السلسلة العامة () {

عودة "اللحمة";

}

}

العامة ثابت الفراغ الرئيسي (سلسلة[] الحجج) {

حيوان حيواني1 = قطة جديدة ();

حيوان حيواني2 = كلب جديد ();

النظام.خارج.برينتلن (حيوان1.الصوت ()) ؛ / / مواء

النظام.خارج.برينتلن (حيوان2.الصوت ()) ؛ / / اللحمة

}

في هذا المثال ، الفئة الأساسية هي فئة الحيوان ، والتي لها طريقة الصوت (). تعتبر فئات القطط والكلاب ورثة لفئة الحيوانات وتتجاوز طريقة الصوت () لتناسب احتياجاتهم.

في الطريقة الرئيسية () ، يتم إنشاء كائنات من فئات القط والكلب وتعيينها لمتغيرات من نوع الحيوان. هذا ممكن بسبب مبدأ تعدد الأشكال. على الرغم من حقيقة أن المتغيرات من النوع حيوان ، عند استدعاء طريقة الصوت () ، سيتم استخدام تنفيذ الطريقة من فئة السليل (في هذه الحالة ، القط والكلب).

وبالتالي ، عند استدعاء طريقة الصوت () ، سيتم إخراج القيمة "مواء" و "اللحمة" للكائنات الحيوانية 1 والحيوانية 2 ، على التوالي. ويرجع ذلك إلى تعدد الأشكال الديناميكي ، الذي يحدد تنفيذ الطريقة الصحيحة بناء على نوع الكائن في وقت تنفيذ البرنامج ، بدلا من وقت الترجمة.

أمثلة على استخدام تعدد الأشكال الديناميكي

تعدد الأشكال الديناميكي هو أحد الآليات الرئيسية للبرمجة الموجهة للكائنات ويسمح لك بمعالجة كائنات من فئات مختلفة بشكل موحد. لنلق نظرة على بعض الأمثلة التي توضح إمكانيات تعدد الأشكال الديناميكي.

مثال 1: سلوك متعدد الأشكال عند العمل مع الأشكال الهندسية

لنفترض أن لدينا فئة أساسية "الشكل" ، والتي ورثت منها فئات" الدائرة "و" المربع "و" المثلث". كل فئة لديها طريقة "حساب المنطقة". بفضل تعدد الأشكال الديناميكي ، يمكننا إنشاء مجموعة من الكائنات من فئات مختلفة واستخدام طريقة "حساب المنطقة" بشكل موحد:

الشكل [] الأشكال = الشكل الجديد [3];

الأشكال [0] = دائرة جديدة();

الأشكال [1] = مربع جديد ();

الأشكال [2] = مثلث جديد ();

إلى عن على (كثافة العمليات أنا = 0; أنا < الأشكال.الطول ؛ أنا {) {

منطقة مزدوجة = الأشكال [أنا].احسب المساحة();

النظام.خارج.برينتلن ("منطقة الشكل:" + منطقة);

}

في هذا المثال ، لكل عنصر من عناصر مصفوفة "الأشكال" ، يتم استدعاء طريقة "حساب المنطقة ()" للفئة المقابلة. بهذه الطريقة يمكننا التعامل مع الأشياء المختلفة بطريقة موحدة ، دون الحاجة إلى معرفة نوعها المحدد.

المثال 2: سلوك متعدد الأشكال عند العمل مع الأعداد المركبة

لنلق نظرة على مثال للعمل مع الأعداد المركبة. لنقم بإنشاء فئة " رقم مركب "بالطرق" إضافة "و" طرح "و"ضرب". ثم سنقوم بإنشاء فئة" اختبار "تقبل كائنين من فئة" الرقم المركب "كمدخلات وتستدعي طرق" إضافة "و" طرح "و" ضرب " منها بشكل موحد:

مجمع الصف العام_الرقم {

خاصة مزدوجة حقيقية;

خاصة مزدوجة وهمية;

رقم المجمع العام (رقم حقيقي مزدوج ، رقم خيالي مزدوج) {

هذا.ريالياشاست = ريالياشاست;

هذا.الجزء التخيلي = الجزء التخيلي;

}

مجمع عام_رقم إضافة (مجمع _رقم آخر) {

المزدوج هو الجزء الحقيقي من النتيجة = هذا.الواقعية + أخرى.الشيء الحقيقي هو;

ضاعف الجزء التخيلي من النتيجة = هذا.جزء وهمي + آخر.هوة خيالية;

عودة مجمع جديد_رقم (جزء حقيقي من النتيجة ، جزء وهمي من النتيجة);

}

مجمع عام_رقم طرح (مجمع _رقم آخر) {

المزدوج هو الجزء الحقيقي من النتيجة = هذا.الشيء الحقيقي مختلف.الشيء الحقيقي هو;

ضاعف الجزء التخيلي من النتيجة = هذا.الجزء الخيالي مختلف.هوة خيالية;

عودة مجمع جديد_رقم (جزء حقيقي من النتيجة ، جزء وهمي من النتيجة);

}

مجمع عام_رقم مضاعفة (مجمع _رقم آخر) {

المزدوج هو الجزء الحقيقي من النتيجة = هذا.الشيء الحقيقي هو * مختلفة.الشيء الحقيقي هو هذا. الشيء الخيالي هو * آخر.هوة خيالية;

ضاعف الجزء التخيلي من النتيجة = هذا.الشيء الحقيقي هو * مختلفة.جزء وهمي + هذا.جزء وهمي * آخر.الشيء الحقيقي هو;

عودة مجمع جديد_رقم (جزء حقيقي من النتيجة ، جزء وهمي من النتيجة);

}

}

اختبار الطبقة العامة {

العامة ثابت الفراغ الرئيسي (سلسلة[] الحجج) {

رقم المجمع رقم 1 = رقم المجمع الجديد (2 ، 3);

رقم المجمع 2 = رقم المجمع الجديد (4 ، 5);

مجموع العدد المركب = الرقم1.أضف (رقم2);

فرق العدد المعقد = الرقم1.طرح (عدد2);

مجمع رقم المنتج = عدد1.ضرب (عدد2);

النظام.خارج.برينتلن ("المبلغ:" + المبلغ);

النظام.خارج.برينتلن ("الفرق:" + الفرق);

النظام.خارج.برينتلن ("العمل:" + العمل);

}

}

في هذا المثال ، تستدعي فئة "المختبر" طرق "إضافة" و "طرح" و "ضرب" لكائنين من فئة "الرقم المركب". بفضل تعدد الأشكال الديناميكي ، يمكننا الوصول إلى طرق الكائنات من فئات مختلفة بشكل موحد.

ما هي الوظائف الافتراضية وكيف ترتبط بتعدد الأشكال الديناميكي

الوظائف الافتراضية هي نوع خاص من الوظائف المحددة في فئة أساسية تسمح بتجاوزها (أو استبدالها) في الفئات المشتقة. تسمح الوظائف الافتراضية باستخدام الربط المتأخر ، وهو جانب رئيسي من تعدد الأشكال الديناميكي.

عندما يتم الإعلان عن دالة افتراضية في الفئة الأساسية ، فإنها تنشئ جدول دالة ظاهري (جدول). يحتوي هذا الجدول على عناوين جميع الوظائف الافتراضية في الفصل ، بالإضافة إلى مؤشر إلى جدول الوظائف الافتراضية للفئة الأساسية (إن وجدت).

عند استدعاء دالة افتراضية من كائن فئة ، يتم البحث عن الدالة المقابلة في جدول الدالة الافتراضية. إذا كان هناك تجاوز لهذه الوظيفة في الفئة المشتقة ، فسيتم استدعاء الإصدار الذي تم تجاوزه. إذا لم يكن هناك تجاوز ، فسيتم استدعاء الإصدار الأساسي من الوظيفة.

وبالتالي ، عند استخدام الوظائف الافتراضية وتعدد الأشكال الديناميكي ، يمكنك الوصول إلى كائنات الفئات المشتقة من خلال المؤشرات أو المراجع إلى الفئة الأساسية واستدعاء وظائفها باستخدام نفس اسم الوظيفة. نتيجة لذلك ، سيتم استدعاء الإصدار الصحيح من الوظيفة ، اعتمادا على نوع الكائن الذي يشير إليه المؤشر أو المرجع.

دعنا نعود إلى المثال مع الفئات" الشكل "و" المستطيل "و"الدائرة". إذا كان لدينا مؤشر لكائن من فئة" الشكل "، ونطلق على الوظيفة الافتراضية" المنطقة () "، اعتمادا على نوع الكائن الذي يشير إليه المؤشر ، سيتم استدعاء الإصدار المقابل من الوظيفة" المنطقة ()". وبالتالي ، يمكننا الحصول على مساحة مستطيل أو دائرة أو أي شكل آخر باستخدام نفس الوظيفة التي تحمل الاسم نفسه.

سؤال وجواب

ما هو تعدد الأشكال الديناميكي?

تعدد الأشكال الديناميكي هو قدرة الكائن على اتخاذ أشكال مختلفة أثناء تنفيذ البرنامج. يسمح لك باستدعاء طرق تحمل نفس الاسم من كائنات مختلفة تم إنشاؤها من نفس الفئة الأساسية أو الواجهة ، والحصول على نتائج مختلفة اعتمادا على التنفيذ المحدد لكل كائن.

كيف يعمل تعدد الأشكال الديناميكي?

يتم تحقيق تعدد الأشكال الديناميكي من خلال الميراث وإعادة تعريف الأساليب. إذا ورثت فئة من فئة أساسية أو نفذت واجهة ، فيمكنها استخدام جميع الطرق المحددة في الفئة الأساسية أو الواجهة. إذا تم تعريف طريقة بنفس الاسم في فئة الوراثة كما هو الحال في الفئة الأساسية ، فعند استدعاء هذه الطريقة ، سيتم استدعاء كائن فئة الوراثة نسخته من الطريقة.

ما هي مزايا استخدام تعدد الأشكال الديناميكي?

يزيد استخدام تعدد الأشكال الديناميكي من مرونة البرنامج وقابليته للتوسعة. يسمح لك بكتابة رمز عالمي يمكنه العمل مع كائنات مختلفة دون معرفة تنفيذها المحدد. يعمل تعدد الأشكال الديناميكي أيضا على تحسين قابلية قراءة الكود ويبسط دعمه ، نظرا لأن التغييرات في تنفيذ فئة واحدة لا تتطلب تغيير الكود باستخدام هذه الفئة.