مفاهيم OOPs للمبتدئين: شرح تعدد الأشكال

نشرت: 2021-12-10

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

يحتوي OOP على أربع كتل بناء أساسية - تعدد الأشكال والتغليف والتجريد والوراثة. نظرًا لأن نطاق مقالتنا يقتصر على تعدد الأشكال في OOPs ، فسنناقش تعدد الأشكال بالتفصيل ، بما في ذلك أمثلة تعدد الأشكال في Java وتعدد الأشكال في Python.

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

جدول المحتويات

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

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

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

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

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

مثال على تعدد الأشكال في جافا

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

أشكال الفئة {

منطقة فارغة عامة () {

System.out.println ("صيغة منطقة") ؛

}

}

مثلث الفئة يمتد الأشكال {

منطقة فارغة عامة () {

System.out.println ("المثلث 1/2 * قاعدة * ارتفاع") ؛

}

}

فئة الدائرة تمتد الأشكال {

منطقة فارغة عامة () {

System.out.println ("الدائرة 3.14 * نصف قطر * نصف قطر") ؛

}

}

فئة رئيسية {

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

الأشكال myShape = أشكال جديدة () ؛ // إنشاء كائن الأشكال

الأشكال myTriangle = new Triangle () ؛ // إنشاء كائن مثلث

الأشكال myCircle = دائرة جديدة () ؛ // إنشاء كائن دائرة

myShape.area () ،

myTriangle.area () ،

myShape.area () ،

myCircle.area () ،

}

}

سيكون إخراج رمز البرنامج أعلاه على النحو التالي:

معادلة مساحة المثلث هي 1/2 * ارتفاع القاعدة *

معادلة مساحة الدائرة هي 3.14 * نصف قطر * نصف قطر

أنواع تعدد الأشكال في OOPs

تعدد الأشكال في OOPs من نوعين - ثابت (تعدد أشكال وقت الترجمة) وديناميكي (تعدد أشكال وقت التشغيل).

1. تعدد الأشكال الثابت

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

  • تحتاج الأساليب إلى أعداد مختلفة من المعلمات.
  • يجب أن تكون أنواع المعلمات مختلفة. على سبيل المثال ، إذا كانت إحدى الطرق تقبل Long ، فإن الطريقة الأخرى تقبل سلسلة.
  • يجب أن تقبل الطرق المعلمات في أوامر مختلفة. على سبيل المثال ، إذا قبلت الطريقة 1 سلسلة طويلة وسلسلة ، فيجب أن تقبل الطريقة الثانية سلسلة ثم طويلة.

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

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

حزمة ثابت

إضافة فئة عامة

{

مجموع باطل (int x، int y)

{

int c = x + y ؛

System.out.println ("إضافة رقمين:" + c) ؛ }

مجموع باطل (int x، int y، int z)

{

int c = x + y + z ؛

System.out.println ("إضافة ثلاثة أرقام:" + c) ؛ }

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

{

هدف الإضافة = إضافة جديدة () ؛

obj.sum (45،34) ؛

obj.sum (60 ، 32 ، 11) ؛

}

}

سيكون ناتج البرنامج أعلاه:

جمع عددين: 79

جمع ثلاثة أعداد: 103

2. تعدد الأشكال الديناميكي

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

فيما يلي مثال على كود Java لإظهار تعدد الأشكال في وقت التشغيل . في المثال ، هناك فئة فائقة "Animal" وثلاث فئات فرعية ، "kangaroo" و "tiger" و "fish". تعمل الفئات الفرعية على توسيع الطبقة الفائقة وتجاوز طريقة "move ()" الخاصة بها. يتم استدعاء طريقة "move ()" بواسطة المتغير المرجعي للفئة الأصلية "Animal".

فئة الحيوان {

نقل باطل () {

System.out.println ("تحريك الحيوانات") ؛

}

}

صنف الكنغر يمتد إلى الحيوان {

نقل باطل () {

System.out.println ("قفزة الكنغر") ؛

}

}

نمر صنف يمتد إلى حيوان {

نقل باطل () {

System.out.println ("مشي النمور") ؛

}

}

صنف الأسماك يمتد إلى حيوان {

نقل باطل () {

System.out.println ("تسبح الأسماك") ؛

}

}

الصف الرئيسي {

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

حيوان أ = حيوان جديد () ؛

حيوان ك = كنغر جديد () ؛ // upcasting

حيوان ر = نمر جديد () ؛ // upcasting

الحيوان و = سمكة جديدة () ؛ // upcasting

ألف تحرك () ؛

k.move () ؛

t.move () ؛

f.move () ؛

}

}

سيكون ناتج البرنامج أعلاه:

تتحرك الحيوانات

حيوان الكنغر يقفز

نمور نمشي

الأسماك تسبح

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

يتألف تعدد الأشكال في بايثون من ثلاثة أنواع - تعدد الأشكال العامل ، وتعدد الأشكال الوظيفي ، وتعدد الأشكال الطبقي. تسمح Python أيضًا بتجاوز الطريقة وليس التحميل الزائد للطريقة.

1. تعدد أشكال المشغل

في Python ، عامل التشغيل "+" له استخدام مزدوج. يتم استخدامه لعمليات الجمع الحسابية في حالة أنواع البيانات الصحيحة ، وبالنسبة للسلاسل ، يقوم عامل التشغيل "+" بتنفيذ السلاسل.

فيما يلي مثال على كود Python حيث يقوم عامل التشغيل "+" بإجراء إضافة على أنواع بيانات عدد صحيح:

عدد 1 = 4

عدد 2 = 5

طباعة (عدد 1 + عدد 2)

ناتج رمز البرنامج أعلاه هو "9."

فيما يلي مثال على كود Python حيث يقوم عامل التشغيل "+" بتنفيذ التسلسل على أنواع بيانات السلسلة:

str1 = "جيد"

str2 = "المساء"

طباعة (str1 + ”“ + str2)

ناتج البرنامج أعلاه سيكون "مساء الخير".

2. وظيفة تعدد الأشكال

تتوافق وظيفة "len ()" في Python مع أنواع بيانات مختلفة مثل القائمة ، والسلسلة ، والصفقة ، والقاموس ، والمجموعة ، ولكنها تُرجع معلومات محددة لكل نوع من أنواع البيانات. هذا مثال:

طباعة (لين ("مبرمج"))

طباعة (len (["Python"، "Java"، "C"]))

print ({“Name”: “Kathy”، “Address”: “Texas”}))

سيحصل البرنامج أعلاه على المخرجات التالية:

9

3

2

3. فئة تعدد الأشكال

لتوسيع مفهوم تعدد الأشكال ، تسمح Python للفئات المتعددة بأن يكون لها طرق بنفس الاسم. فيما يلي مثال لإظهار تعدد الأشكال في طرق الفصل في بايثون. في المثال ، هناك فئتان ، "Cat" و "Dog". لديهم بنية مماثلة ولديهم نفس أسماء الطرق "make_sound ()" و "info ()."

فئة القط:

def __init __ (الذات ، الاسم ، العمر):

self.name = الاسم

العمر الذاتي = العمر

معلومات مواطنه (ذاتي):

print (f "أنا قطة. اسمي {self.name}. عمري {self.age} عام.")

def make_sound (ذاتي):

طباعة ("مواء")

فئة الكلب:

def __init __ (الذات ، الاسم ، العمر):

self.name = الاسم

العمر الذاتي = العمر

معلومات مواطنه (ذاتي):

print (f "أنا كلب. اسمي {self.name}. عمري {self.age} عام.")

def make_sound (ذاتي):

طباعة ("Bark")

cat1 = Cat ("Minnie"، 3)

dog1 = كلب ("توم" ، 6)

للحيوان في (cat1، dog1):

animal.make_sound ()

animal.info ()

animal.make_sound ()

سيكون الإخراج على النحو التالي:

مواء

انا قطة. اسمي ميني. عمري 3 سنوات.

مواء

نباح

أنا كلب. اسمي توم. أنا بعمر 6 سنوات.

نباح

4. أسلوب التجاوز

تسمح Python أيضًا للفئات الفرعية أن ترث السمات والطرق من الفئة الأصلية. يمكن إعادة تعريف طرق وسمات معينة لتلائم الفئة الفرعية (تجاوز الطريقة). ثم يسمح تعدد الأشكال بالوصول إلى الأساليب والسمات التي تم تجاوزها بنفس اسم الفئة الأصلية.

فيما يلي مثال على كود Python لتوضيح تجاوز الطريقة:

من استيراد الرياضيات بي

شكل الطبقة:

def __init __ (الذات ، الاسم):

self.name = الاسم

منطقة def (ذاتية):

يمر

حقيقة معلومة (ذاتية):

العودة "أنا شخصية مغلقة."

def __str __ (ذاتي):

إرجاع self.name

فئة مربعة (الشكل):

def __init __ (ذاتي ، طول):

super () .__ init __ ("مربع")

الطول = الطول

منطقة def (ذاتية):

العودة الذاتية الطول ** 2

حقيقة معلومة (ذاتية):

إرجاع "كل زاوية في مربع تساوي 90 درجة."

فئة الدائرة (الشكل):

def __init __ (ذاتي ، نصف القطر):

super () .__ init __ ("دائرة")

نصف القطر الذاتي = نصف القطر

منطقة def (ذاتية):

إرجاع pi * نصف نصف قطرها الذاتي ** 2

أ = مربع (4)

ب = دائرة (7)

طباعة (ب)

طباعة (b.fact ())

طباعة (a.fact ())

طباعة (b.area ())

سيحصل البرنامج أعلاه على المخرجات التالية:

دائرة

أنا شخصية مغلقة.

كل زاوية في المربع تساوي 90 درجة.

153.93804002589985

تعرف على المزيد حول طريقة تجاوز.

مزايا تعدد الأشكال في OOPs

تعدد الأشكال في OOPs له ثلاث مزايا مهمة. وهم على النحو التالي:

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

الطريق إلى الأمام

تقدم upGrad ، بالشراكة مع جامعة Liverpool John Moores المرموقة ، برنامج ماجستير صارم للعلوم في علوم البيانات عبر الإنترنت للمهنيين العاملين الذين يتطلعون إلى الحصول على وظيفة في علم البيانات. تنتهي الدورة بدرجة الماجستير من جامعة ليفربول جون مورز وشهادة تنفيذية لبرنامج PG من معهد IIIT بنغالور.

يسلط الضوء على البرنامج:

  • أكثر من 500 ساعة من المحتوى ، وأكثر من 60 دراسة حالة ومشروعًا ، وأكثر من 20 جلسة مباشرة
  • تغطية شاملة لأكثر من 14 أداة وبرنامج مثل Python و AWS و MySQL والمزيد
  • جلسات تدريب مع خبراء الصناعة
  • التعلم من الأقران والتواصل الصناعي
  • 360 درجة المساعدة المهنية

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

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

لماذا يتم استخدام تعدد الأشكال في OOPs؟

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

ما هي طريقة التحميل الزائد في جافا؟

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

ما الفرق بين التحميل الزائد والتجاوز؟

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