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

 التاريخ 
بدء الاهتمام والتطوير في تعددية الأشكال في بداية الستينيات (1960م) وبدء التنفيذ العملي في نهاية العقد.
صنف كريستوفر ستراشي في مفاهيم أساسية في لغات البرمجة أن تعددية الأشكال الحدودية أو البرمجة العامة و تعددية الأشكال المخصصة الفئتين الرئيسيتين لتعددية الأشكال.
و عُرفت تعددية الأشكال الحدودية أو البرمجة العامة كميزة في لغة البرمجة "الجول 68", ، بينما عُرفت تعددية الأشكال الموروثة'' كميزة أساسية في لغة البرمجة «إم إل».
وفي عام 1985م قدم بيتر فيجنر ولوكا كارديلي ورقة بحثية توضح أن لغة البرمجة «سيمولا» كأول لغة تنفذ تعددية الأشكال الموروثة.

الأنواع

تعددية الأشكال المخصصة 
عرّف كريستوفر ستراشي هذا النوع من تعددية الأشكال أنه يمكن تطبيقه بناءً على المعطيات باختلاف الأنواع.

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

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.

وكما وضحنا أن الدالة Add يتم استدعاؤها بناءً على المعطيات\المدخلات.

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

والمثال التالي بلغة «هاسكال» يوضح كيفية استخدام هذا النوع من تعددية الأشكال، بحيث يمكننا استخدام أكثر من نوع كمدخل للصنف:

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)

وهذا النوع من تعددية الأشكال متوفر أيضا في لغات مختلفة مثل «جافا، سي شارب، سي بلس بلس» وهاكم مثال على «سي شارب»:

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) {
  ...
}

تعددية الأشكال الموروثة 
استخدامُ هذا النوع يساعدنا لتوريث صفات ودوال من أنواع وأصناف رئيسية لأنواع وأصناف فرعية.

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

abstract class Animal {
    abstract String talk();
}

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

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

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

static void main(String[] args) {
    letsHear(new Cat());
    letsHear(new Dog());
}

وفي مثال آخر، هب أن هناك نوع رئيسي يُسمى «رقم» بمكن إدراج أنواع فرعية منه باسم «رقم صحيح»، «رقم عشري» إلى آخره من أنواع الأرقام.

مراجع 

أنواع البيانات
برمجة كائنية التوجه
برمجة وظيفية
تعدد الأشكال
مفاهيم لغات البرمجة
نظرية النمط
تعددية الأشكال في لغات البرمجة و نظرية النمط ، تعتبر تعددية الأشكال طريقة ل التعامل مع الأنواع المختلفة . و يمكن نا القول أن ه شكل واحد رئيسي وينبثق من ه أشكال فرعية يسهل التعامل مع ها . ' و هناك أنواع شائعة من تعددية الأشكال ، أبرز ها : تعددية الأشكال المخصصة \ : و ذٰلك ب تعريف واجهة بينية مشتركة ل مجموعة مجهولة العدد ( اعتباطية ) من الأنواع المحددة المنفردة . تعددية الأشكال المعلمي أو الوسيطي \ : عندما يكون لدي نا واحد أو أكثر من الأنواع غير المحددة بالاسم بل عن طريق رمز مجرد يمكن أن يمثل أي نوع . تعددية الأشكال الفرعية ( و تدعى أيضا تعددية الأشكال الفرعية أو تعددية الأشكال الضمنية ) \ : عندما يشير الاسم إلى أمثال من عدة أصناف مختلفة مرتبطة ب بعض ال أصناف الأصل المشتركة . التاريخ بدء الاهتمام و التطوير في تعددية الأشكال في بداية الستينيات ) و بدء التنفيذ العمل ي في نهاية العقد . صنف كريستوفر ستراشي في مفاهيم أساسية في لغات البرمجة أن تعددية الأشكال الحدودية أو البرمجة العامة و تعددية الأشكال المخصصة الفئتين الرئيسيتين لتعددية الأشكال . و عُرفت تعددية الأشكال الحدودية أو البرمجة العامة كميزة في لغة البرمجة " الجول , ، بينما عُرفت تعددية الأشكال الموروثة ' ' كميزة أساسية في لغة البرمجة « إم إل » . و في عام قدم بيتر فيجنر ولوكا كارديلي ورقة بحثية توضح أن لغة البرمجة « سيمولا » ك أول لغة تنفذ تعددية الأشكال الموروثة . الأنواع تعددية الأشكال المخصصة عرّف كريستوفر ستراشي هذا النوع من تعددية الأشكال أن ه يمكن تطبيق ه بناءً على المعطيات ب اختلاف الأنواع . ملحوظة : يعرف هذا النوع أيضا ب اسم قابلية إعادة استخدام الوظيفة أو قابلية إعادة استخدام المشغل\الرمز . و هٰذا المثال با الأسف ب لغة باسكال بإتسخدام مفهوم الديلفى الدالة التي تسمى Add يمكن استخدام ها ل أكثر من نوع : program A dhoc ; function A dd ( x , y\ : Integer ) \ : Integer ; begin A dd\ : = x + y end ; function A dd ( s , t\ : String ) \ : String ; begin A dd\ : = Concat ( s , t ) end ; begin Writeln ( A dd ( 1,; ( * Prints " 3 " * ) Writeln ( A dd ( ' H ello , ' , ' World ! ' ) ) ; ( * Prints " H ello , World ! " * ) end . و كما وضحنا أن الدالة Add يتم استدعاء ها بناءً على المعطيات \المدخلات . تعددية الأشكال الحدودية أو البرمجة العامة مفهوم تعددية الأشكال الحدودية ينطبق على كل من أنواع البيانات والدَّوال ، و هٰذا المفهوم يساعد نا على كتابة هم ب طريقة عامة ب حيث يمكن نا التعامل مع القيم والمحتوى ب دون الاعتماد أو الالتفات لنوعية هم . و المثال التالي ب لغة « هاسكال » يوضح كيفية استخدام هذا النوع من تعددية الأشكال ، ب حيث يمكن نا استخدام أكثر من نوع كمدخل للصنف : data List a = Nil | Cons a ( List a ) lengt h\ : : List a - > Integer length Nil = 0 length ( Cons x xs ) = + length xs map\ : : ( a - > b ) - > List a - > List b map f Nil = Nil map f ( Cons x xs ) = Cons ( f x ) ( map f xs ) و هٰذا النوع من تعددية الأشكال متوفر أيضا في لغات مختلفة مثل « جافا ، سي شارب ، سي بلس بلس » وهاكم مثال على « سي شارب » : class List<T > { class Node <T > { T elem ; Node <T > next ; } Node <T > h ead ; int length ( ) { . . . } } List<B > map ( F un c <A , B > f , List <A > xs ) { \ . . . } تعددية الأشكال الموروثة استخدامُ هذا النوع يساعد نا لتوريث صفات ودوال من أنواع و أصناف رئيسية لأنواع و أصناف فرعية . ف في المثال التالي ، قمنا ب تعريف نوع رئيسي و هو « حيوان » ، لذا ف إن أي حيوان فرعي يرث صفات ووظائف هذا الحيوان الرئيسي ب اختلاف الطريقة والتنفيذ ب الطبع ، وهاكم مثال ب استخدام لغة « جافا » : abstract class A nim al { abstract String talk ( ) ; } class Cat extends A nim al { String talk ( ) { return " Meow ! " ; } } class Dog extends A nim al { String talk ( ) { return " Woof ! " ; } } static void letsH ear ( final A nim al a ) { println ( a.talk ( ) ) ; } static void main ( String [ ] args ) { letsH ear ( new Cat ( ) ) ; letsH ear ( new Dog ( ) ) ; } و في مثال آخر ، هب أن هناك نوع رئيسي يُسمى « رقم » بمكن إدراج أنواع فرعية من ه ب اسم « رقم صحيح » ، « رقم عشر ي » إلى آخره من أنواع الأرقام . مراجع أنواع البيانات برمجة كائنية التوجه برمجة وظيفية تعدد الأشكال مفاهيم لغات البرمجة نظرية النمط