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

تعدد الأشكال (علم الحاسوب)

من ويكيبيديا، الموسوعة الحرة
اذهب إلى التنقل اذهب إلى البحث
Question book-new.svg
المحتوى هنا ينقصه الاستشهاد بمصادر. يرجى إيراد مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (مايو 2019)
Commons-emblem-copyedit.svg
هذه المقالة ليس بها أي وصلات لمقالاتٍ أخرى للمساعدة في ترابط مقالات الموسوعة. فضلًا ساعد في تحسين هذه المقالة بإضافة وصلات إلى المقالات المتعلقة بها الموجودة في النص الحالي. (أبريل 2019)
N write.svg
هذه مقالة غير مراجعة. ينبغي أن يزال هذا القالب بعد أن يراجعها محرر عدا الذي أنشأها؛ إذا لزم الأمر فيجب أن توسم المقالة بقوالب الصيانة المناسبة. (أبريل 2019)

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

وهناك أنواع شائعة من تعددية الأشكال، أبرزها:

التاريخ (الإستقراء)[عدل]

بدء الاهتمام والتطوير في تعددية الأشكال في بداية الستينيات (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());
}

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