انتقل إلى المحتوى

مستخدم:Nooralbustanj/ملعب

من ويكيبيديا، الموسوعة الحرة

Polymorphism تعدد الاشكال في لغات البرمجة نستخدم مصطلح تعدد الأشكال وهو توفير واجهة واحدة للكيانات من أنواع مختلفة. [1] وتعدد الأشكال هو نوع الذي يمكن أن يطبق أيضا على القيم من نوع آخر، أو أنواع العمليات [2] وهناك العديد من أنواع مختلفة جوهريا لتعدد الأشكال:

•إذا كانت الوظيفة تدل على تطبيقات مختلفة ويحتمل أن تكون غير متجانسة اعتمادا على مجموعة محدودة من أنواع وتركيبات المحددة بشكل فردي،. وهذا يسمى مخصصة تعدد الأشكال ad hoc polymorphism. ويدعم مخصصة تعدد الأشكال العديد من اللغات باستخدام وظيفة الحمولة الزائدة function overloading. •إذا تم كتابة التعليمات البرمجية دون ذكر أي نوع معين، فبالتالي يمكن استخدامها بشفافية مع أي عدد من أنواع جديدة، ويسمى تعدد الأشكال الحدودي parametric polymorphism. وفي المجتمع البرمجة الكائنية التوجه، في كثير من الأحيان ما يعرف بالوراثة أو البرمجة العامة. في المجتمع برمجة وظيفية، وهذا غالبا ما يسمى ببساطة تعدد الأشكال. •التصنيف الفرعي Subtyping(أو إدراج تعدد الأشكال) هو مفهوم حيث قد يدل على اسم يدل على العديد من حالات اختلاف الفئات. طالما ترتبط مع بعض من قبل فئات السوبر المشتركة[common superclass. [3 .في البرمجة كائنية التوجه، وكثيرا ما يشار إلى هذا ببساطة تعدد الأشكال.

التفاعل بين تعدد الأشكال الحدودي والتصنيف الفرعي يؤدي إلى مفاهيم التباين النوعي والكمي التي يحدها.


التاريخ[عدل]

مخصص تعدد الأشكال وتعدد الأشكال الحدودي وصفت أصلا في المفاهيم الأساسية في لغات البرمجة، ومجموعة من المحاضرات مكتوبة في عام 1967 من قبل عالم الكمبيوتر البريطاني كريستوفر ستراتشي. [4] وفي ورقة 1985، قدم بيتر واجنر ولوكاكردل مصطلح تعدد الأشكال لفرع النموذج والميراث. [2] ومع ذلك، تطبيقات التصنيف الفرعي والميراث تسبق مصطلح 'إدراج تعدد الأشكال "، التي ظهرت مع سيمولا في عام 1967. تعدد الأشكال الحدودي يسمح للوظيفة أو نوع البيانات المراد كتابتها بشكل عام، بحيث يمكن التعامل مع القيم بشكل موحد دون الاعتماد على أنواعها. [6] حدودي التعدد هو وسيلة لجعل اللغة أكثر تعبيرا، في حين لا يزال الحفاظ على كامل الثبات من نوع السلامة .

أنواع تعدد الأشكال[عدل]

2.1 مخصص تعدد الأشكال[عدل]

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

program Adhoc;

function Add( x, y : Integer ) : Integer;
begin
    Add := x + y
end;

function Add( s, t : String ) : String;
begin
    Add := Concat( s, t )
end;

begin
    Writeln(Add(1, 2));                   (* Prints "3"             *)
    Writeln(Add('Hello, ', 'World!'));    (* Prints "Hello, World!" *)
.end

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

كما تم تعريف نوع ضمني كتحويل شكل من أشكال التعدد، ويشار إليها باكراه تعدد الأشكال[5] coercion polymorphism.

2.2 تعدد الأشكال الحدودي[عدل]

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

data List a = Nil | Cons a (List a)

length :: List a -> Integer
length Nil         = 0
length (Cons x xs) = 1 + length xs

map :: (a -> b) -> List a -> List b
map f Nil         = Nil
map f (Cons x xs) = Cons (f x) (map f xs)

تعدد الأشكال حدودي متوفر في عدة لغات وجوه المنحى أيضا. على سبيل المثال، في قوالب++c و D، أو تحت اسم الوراثة في جافا:

class List<T> {
    class Node<T> {
        T elem;
        Node<T> next;
    }
    Node<T> head;
    int length() { ... }
}

List<B> map(Func<A,B> f, List<A> xs) {
    ...
}

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

2.3 التصنيف الفرعي[عدل]

بعض اللغات تستخدم فكرة التصنيف الفرعي للحد من مجموعة من الأنواع التي يمكن استخدامها في حالة معينة من تعدد الأشكال. في هذه اللغات، وتعدد الأشكال سلالة (يشار إليها أحيانا باسم إدراج تعدد الأشكال)وظيفته تسمح المراد كتابتها إلى اتخاذ كائن من نوع معين T، ولكن أيضا يعمل بشكل صحيح إذا مر كائن ينتمي إلى نوع S هذا هو نوع فرعي من T (وفقا لمبدأ الإحلال Liskov). يتم كتابة هذا النوع احيانا بنسبة S <: T. والعكس من ذلك، يقال T أن يكون نوع سوبر S—كتابي T :> S عادة ما يتم حل S.

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

abstract class Animal {
    abstract String talk();
}

class Cat extends Animal {
    String talk() {
        return "Meow!";
    }
}

class Dog extends Animal {
    String talk() {
        return "Woof!";
    }
}

void letsHear(Animal a) {
    println(a.talk());
}

void main() {
    letsHear(new Cat());
    letsHear(new Dog());
}

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

جوانب التنفيذ[عدل]

3.1 تعدد الأشكال والديناميكية[عدل]

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

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

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


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

كما تم تعريف نوع ضمني كتحويل شكل من أشكال التعدد، ويشار إليها باكراه تعدد الأشكال[5] coercion polymorphism.

المراجع[عدل]

المراجع الخارجية[عدل]