ماذا يعني "التحميل الزائد"/"التحميل الزائد"/"التحميل الزائد"؟

StackOverflow https://stackoverflow.com/questions/289997

  •  08-07-2019
  •  | 
  •  

سؤال

ماذا يعني "التحميل الزائد"/"الحمل الزائد" فيما يتعلق بالبرمجة؟

هل كانت مفيدة؟

المحلول

وهذا يعني أنك تقدم وظيفة (طريقة أو مشغل) بنفس الاسم ، ولكن بتوقيع مختلف. فمثلا:

void doSomething();
int doSomething(string x);
int doSomething(int a, int b, int c);

نصائح أخرى

مبدأ اساسي

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

بالنسبة إلى EG System.DateTime Class في C# ، لديك أكثر من طريقة tostring واحدة. يستخدم tostring القياسي الثقافة الافتراضية للنظام لتحويل وقت البيانات إلى سلسلة:

new DateTime(2008, 11, 14).ToString(); // returns "14/11/2008" in America

في حين أن الحمل الزائد الآخر من نفس الطريقة يسمح للمستخدم بتخصيص التنسيق:

new DateTime(2008, 11, 14).ToString("dd MMM yyyy"); // returns "11 Nov 2008"

في بعض الأحيان قد يكون اسم المعلمة هو نفسه ولكن قد تختلف أنواع المعلمات:

Convert.ToInt32(123m);

يحول العشري إلى int

Convert.ToInt32("123");

يحول سلسلة إلى int.

قرار التحميل الزائد

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

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

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

void print(int i);
void print(char i);
void print(UserDefinedType t);

في هذه الحالة ، سيكون للدالة print () ثلاثة أحمال زائدة.

وهذا يعني وجود إصدارات مختلفة من نفس الوظيفة التي تأخذ أنواعًا مختلفة من المعلمات. مثل هذه الوظيفة "مثقلة". على سبيل المثال ، خذ الوظيفة التالية:

void Print(std::string str) {
  std::cout << str << endl;
}

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

void Print(int i) {
  std::cout << i << endl;
}

الآن يتم تحميل الوظيفة ، ويعتمد إصدار الوظيفة على المعلمات التي تعطيها.

أجاب آخرون على ماهية الحمل الزائد. عندما تبدأ في الخلط بين التجاوز/التجاوز.

على عكس التحميل الزائد ، فإن الإفراط في تحديد طريقة بنفس التوقيع في الفئة الفرعية (أو فئة الطفل) ، والتي تتجاوز تنفيذ الفئات الأصل. تتطلب بعض اللغة توجيهًا صريحًا ، مثل virtual وظيفة العضو في C ++ أو override في دلفي و C#.

using System;

public class DrawingObject
{
    public virtual void Draw()
    {
        Console.WriteLine("I'm just a generic drawing object.");
    }
}

public class Line : DrawingObject
{
    public override void Draw()
    {
        Console.WriteLine("I'm a Line.");
    }
}

الطريقة التي تم تحميلها الزائد هي واحدة مع عدة خيارات لرقم ونوع المعلمات. على سبيل المثال:

foo(foo)

foo(foo, bar)

كلاهما سيفعل نفس الشيء نسبيًا ولكن لديه معلمة ثانية لمزيد من الخيارات

كما يمكنك الحصول على نفس الطريقة تأخذ أنواعًا مختلفة

int Convert(int i)
int Convert(double i)
int Convert(float i)

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

التحميل الزائد هي نسخة الرجل الفقير من multimethods من الإغلاق واللغات الأخرى. إنه مربك.

تجاوز هو المعتاد oo واحد. يتلاشى مع الميراث ، نسميه إعادة التعريف أيضًا (على سبيل المثال في https://stackoverflow.com/users/3827/eed3si9n's إجابة Line يوفر تعريفًا متخصصًا لـ Draw().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top