سؤال

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

لماذا جملتين فقط؟لأن التعريف قصير وذكي.الشرح طويل ويحتوي على أمثلة ورمز.ابحث هنا عن التوضيحات (الإجابة على تلك الصفحات ليست مرضية لسؤالي):

تعدد الأشكال مقابل التجاوز مقابل التحميل الزائد
حاول وصف تعدد الأشكال بسهولة قدر الإمكان

لماذا أسأل هذا السؤال؟لأنني سُئلت نفس السؤال ووجدت أنني لم أتمكن من التوصل إلى تعريف مُرضٍ (وفقًا لمعاييري العالية جدًا).أريد أن أرى ما إذا كان أي من العقول العظيمة في هذا الموقع يمكنه القيام بذلك.

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

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

المحلول

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

و(*) في الحالة المثالية، على أي حال - من الواضح في كثير من الأحيان قد اختار رمز الدعوة التنفيذ الملائم عمدا جدا

نصائح أخرى

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

حسنا، على الأقل أقوم به، ولكن أنا غريب في بعض السلوكيات حتى ما أعرف.

وهذا يوضح الميراث (يمكن أن تؤكل الفاكهة)، تعدد الأشكال (شيء أن يأكل الفاكهة يمكن تناول جميع أنواع الفاكهة)، والتغليف (الموز يحتوي على الجلد).

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

وتعدد الأشكال ويعلنون واجهة موحدة التي لا اكتب على علم، وترك تفاصيل التنفيذ لأنواع محددة أن تنفيذ الواجهة.

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

  • تعدد الأشكال المخصص (يشبه البطة ويمشي مثل البطة => بطة).يمكن رؤيتها في هاسكل وبايثون على سبيل المثال.

  • تعدد الأشكال العام (حيث يكون النوع مثالًا لبعض الأنواع العامة).يمكن رؤيته في C++ على سبيل المثال (متجه int ومتجه السلسلة لهما حجم وظيفة العضو).

  • تعدد الأشكال الفرعي (حيث يرث النوع من نوع آخر).يمكن رؤيته في معظم لغات برمجة OO (أي.المثلث هو الشكل).

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

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

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

<القوي> تعريف : ل

وتعدد الأشكال هي كلمة $ 10 للفكرة $ 1 - أنني عندما تسأل عن شيء ينبغي القيام به، لا يهمني كيف يتم تحقيق ذلك طالما أن النتيجة النهائية هي المناسبة. طالما أن <م> خدمة يتم توفيرها بشكل صحيح، I <م> لا يهمني حول <م> التنفيذ .

مناقشة

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

أمثلة

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

وعندما تريد طباعة مستند، I طباعته. لا يهمني حول اللغة التنفيذ، والعلامة التجارية للطابعة، وأسلوب الاتصال، واختيار للاستهلاك أو نوعية الورق.

وتطبيقات متعددة من نفس واجهة.

وعلى سبيل المثال: نماذج كثيرة من الهاتف تنفيذ واجهة لوحة المفاتيح الرقمية

.

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

وطيب أن من الصعب ....

وأنا بس كنت أضيف تفسير بلدي ما هو تعدد الأشكال: بشكل عام جدا، تعدد الأشكال هو فعل توفير <م> اجهة واحدة إلى كيانات <م> أنواع مختلفة .

وهذا العام بدلا من ذلك، ولكن هذه هي الطريقة الوحيدة التي يمكنني أن أفكر في التفاف جميع الأنواع الثلاثة من الأشكال أعرف عن: <م> مخصص ، <م> حدودي و <م> النوع الفرعي . سأذهب في مزيد من التفاصيل أدناه، ووفرز أنواع تعدد الأشكال بالاسم، حسب الترتيب الأبجدي. واحد كنت مهتما في هو على الارجح <م> النوع الفرعي تعدد الأشكال ، الذي هو آخر واحد.

المخصص تعدد الأشكال

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

public String format(int a) {
    return String.format("%2d", a);
}

public String format(Date a) {
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a);
}

وكلتا الطريقتين format تتقاسم <م> اجهة واحدة ، لكنها تعمل على كيانات <م> أنواع مختلفة .

تعدد الأشكال حدودي

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

وعلى سبيل المثال، List[T] جاوة تتوقع T المعلمة في وقت مثيل، وهذه المعلمة يحدد نوع الكائن الناتجة عن ذلك.

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

وList[String] وList[Date] حصة <م> اجهة واحدة ، ولكن العمل على (ونحن) <م> أنواع مختلفة .

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

النوع الفرعي تعدد الأشكال هو ربما ما كنت تعني في البداية في سؤالك: إنها فعل توفير واجهة واحدة لتطبيقات متعددة من نفس نوع

لاستخدام المثال العرفي: تقدم Animal عقد أن جميع تطبيقات يجب أن تحترم. Dog هو Animal، وعلى هذا النحو تدعم جميع العمليات تعلن أن Animal. وفقا ل Liskov مبدأ الإحلال ، وهذا يتيح لك استخدام مثيل Dog حيث مثيل Animal ومن المتوقع (ولكن ليس العكس).

إذا Cat وDog كلاهما فرعية من Animal، ثم أنها تشترك جميعها في اجهة واحدة ولكن هي في الواقع <م> أنواع مختلفة .

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

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

وبول.

وتعدد الأشكال == فئات متعددة + نفس تواقيع طريقة + سلوك فئة محددة.

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

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

1. Compile-time (static) polymorphism or (ad hoc) polymorphism.

وهذا ببساطة هو التحميل الزائد للطريقة والتحميل الزائد للمشغل

2.  Run time or (dynamic) polymorphism.

الفصل الدراسي الأول موروث من مصطلحات Java وC++.

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

وعلى حد علمي هناك ثلاث طرق للتنفيذ (مدة العرض) تعدد الأشكال.

 1. Parametric polymorphism or simply the use of generics (templates in C++).

 2. Inheritance-based polymorphism or subtyping.

 3. Interface-based polymorphism.

مثال بسيط على تعدد الأشكال القائم على الواجهة:

interface Imobile
{
    void Move();
}

class Person :Imobile
{
    public void Move() { Console.WriteLine("I am a person and am moving in my way."); }
}

class Bird :Imobile
{
    public void Move() { Console.WriteLine("I am a bird and am moving in my way."); }
}

class Car :Imobile
{
    public void Move() { Console.WriteLine("I am a car and am moving in my way."); }
}


class Program
{

    static void Main(string[] args)
    {
        // Preparing a list of objects
        List<Imobile> mobileList = new List<Imobile>();

        mobileList.Add(new Person());
        mobileList.Add(new Bird());
        mobileList.Add(new Car());

        foreach (Imobile mobile in mobileList)
        {
            mobile.Move();
        }

        // Keep the console open
        Console.WriteLine("Press any key to exit the program:");
        Console.ReadKey();
    }
}

انتاج:

 I am a person and am moving in my way.
 I am a bird and am moving in my way.
 I am a car and am moving in my way.
 Press any key to exit the program:

وأشكال متعددة من كائن واحد يسمى تعدد الأشكال.

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

وتعدد الأشكال هو سمة من لغات البرمجة التي تسمح للكائن إلى أن تعامل على أنها مثيل supertype لها.

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

تعدد الأشكال

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

عبر:http://www.agiledata.org/essays/objectOrientation101.html

وهذا هو التعريف أنني قد اتبعت دائما:

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

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

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

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

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

على تعدد الأشكال هي وظيفة اللغة السماح كود حسابي رفيع المستوى لتعمل دون تغيير على أنواع متعددة من البيانات. و الجملة الأخرى، كل ما كان ل... ؛-P.

و(أنواع مدرجة الدعم C ++ ويتناقض في جوابي: تعدد الأشكال في ج ++ )

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

ويمكنك تحديد قائمة على النحو التالي:

List list = new List();

ولكن إذا قمت بفحص IList، يمكنك الاستفادة من واجهة على النحو التالي:

IList list = new List();

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

والآن، معلومات أكثر قيمة قادم:
جافا كتبها متعددة الأشكال الافتراضية، في حين NET و C ++ ليست، في MS، لديك للإعلان عن وظيفة virtual قاعدة (وفي. NET override الكلمة).

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

لتوقيع أسلوب معين، يتم تشغيل تطبيقات طريقة مختلفة لمختلف، المرتبطة بشكل هرمي، والطبقات.

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

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

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

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

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

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

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

وتعدد الأشكال هو قدرة وظيفة لتتكيف تلقائيا لقبول إدخال البيانات من أنواع البيانات المختلفة. يمكنك 'إضافة' الزوجي اثنين "1.1" و "2.2" والحصول على "3.3" أو "أضف 'سلسلتين" المكدس "و" تجاوز "والحصول على" ستاكوفيرفلوو ".

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

scroll top