تعدد الأشكال
مفهوم تعدد الأشكال
تعدد الأشكال أو بوليمورفيزم (Polymorphism) هو مجرد أسلوب في كتابة الكود يقصد منه بناء دالة تنفذ أوامر مختلفة على حسب الكائن الذي نمرره لها عند إستدعائها.
تعدد الأشكال يكون مرتبط بشكل أساسي بالوراثة حيث تكون الدالة مبنية على أساس الكلاس الأب، و عند إستدعائها نمرر لها كائن من إحدى الكلاسات التي ترث منه.
تطبيق مبدأ تعدد الأشكال
في المثال التالي قمنا بتعريف كلاس إسمه
بعدها قمنا بتعريف كلاس إسمه
بعدها قمنا بإنشاء دالة إسمها
في النهاية قمنا بإنشاء كائن من الكلاس
مثال
<!DOCTYPE html>
<html>
<body>
<script>
// ليحتوي على الأشياء التي يجب أن يملكها أي كلاس يمثل شكل هندسي Shape هنا قمنا بإنشاء كلاس إسمه
class Shape {
// الهدف منها أن تطبع مساحة الشكل الهندسي printArea هنا قمنا بإضافة دالة إسمها
printArea() {
document.write('No shape is specified! <br>');
}
}
// لأنه سيمثل مربع Shape يرث من الكلاس Square هنا قمنا بإنشاء كلاس إسمه
class Square extends Shape {
// هنا قمنا بإضافة كونستركتور و فيه يتم إنشاء خاصية جديدة
constructor(side) {
super();
this.side = side;
}
// حتى تطبع المساحة بما يتناسب مع الكلاس printArea() هنا قمنا بإعادة تعريف الدالة
printArea() {
document.write('Square area = ' + (this.side * this.side) + '<br>');
}
}
// لأنه سيمثل مستطيل Shape يرث من الكلاس Rectangle هنا قمنا بإنشاء كلاس إسمه
class Rectangle extends Shape {
// هنا قمنا بإضافة كونستركتور و فيه يتم إنشاء خاصيتين جديدتين
constructor(length, width) {
super();
this.length = length;
this.width = width;
}
// حتى تطبع المساحة بما يتناسب مع الكلاس printArea() هنا قمنا بإعادة تعريف الدالة
printArea() {
document.write('Rectangle area = ' + (this.length * this.width) + '<br>');
}
}
// Shape عند استدعاءها نمرر لها كائن يرث من الكلاس printCountryInfo هنا قمنا بتعريف دالة إسمها
function printShapeArea(shape)
{
// shape من الكائن الذي نمرره لها في الباراميتر printArea() هنا سيتم استدعاء الدالة
shape.printArea();
}
// Rectangle و كائن من الكلاس Square هنا قمنا بإنشاء كائن من الكلاس
let square = new Square(3);
let rectangle = new Rectangle(3, 4);
// لها rectangle و square و تمرير الكائنين printShapeArea() هنا قمنا باستدعاء الدالة
printShapeArea(square);
printShapeArea(rectangle);
</script>
</body>
</html>
نتيجة التشغيل:
Rectangle area = 12
تطبيق مبدأ تعدد الأشكال مع المصفوفات
في المثال التالي قمنا بإعادة المثال السابق و لكننا هذه المرة قمنا بوضع الكائنين
بعدها قمنا بإنشاء حلقة تمر على الكائنات التي وضعناها في المصفوفة
مثال
<!DOCTYPE html>
<html>
<body>
<script>
// ليحتوي على الأشياء التي يجب أن يملكها أي كلاس يمثل شكل هندسي Shape هنا قمنا بإنشاء كلاس إسمه
class Shape {
// الهدف منها أن تطبع مساحة الشكل الهندسي printArea هنا قمنا بإضافة دالة إسمها
printArea() {
document.write('No shape is specified! <br>');
}
}
// لأنه سيمثل مربع Shape يرث من الكلاس Square هنا قمنا بإنشاء كلاس إسمه
class Square extends Shape {
// هنا قمنا بإضافة كونستركتور و فيه يتم إنشاء خاصية جديدة
constructor(side) {
super();
this.side = side;
}
// حتى تطبع المساحة بما يتناسب مع الكلاس printArea() هنا قمنا بإعادة تعريف الدالة
printArea() {
document.write('Square area = ' + (this.side * this.side) + '<br>');
}
}
// لأنه سيمثل مستطيل Shape يرث من الكلاس Rectangle هنا قمنا بإنشاء كلاس إسمه
class Rectangle extends Shape {
// هنا قمنا بإضافة كونستركتور و فيه يتم إنشاء خاصيتين جديدتين
constructor(length, width) {
super();
this.length = length;
this.width = width;
}
// حتى تطبع المساحة بما يتناسب مع الكلاس printArea() هنا قمنا بإعادة تعريف الدالة
printArea() {
document.write('Rectangle area = ' + (this.length * this.width) + '<br>');
}
}
// Shape عند استدعاءها نمرر لها كائن يرث من الكلاس printCountryInfo هنا قمنا بتعريف دالة إسمها
function printShapeArea(shape)
{
// shape من الكائن الذي نمرره لها في الباراميتر printArea() هنا سيتم استدعاء الدالة
shape.printArea();
}
// Rectangle و كائن من الكلاس Square هنا قمنا بإنشاء كائن من الكلاس
let square = new Square(3);
let rectangle = new Rectangle(3, 4);
// shapes في مصفوفة إسمها rectangle و square هنا قمنا بوضع الكائنين
let shapes = [square, rectangle];
// shape و في كل مرة تضع عنصر جديد في المتغير shapes هنا قمنا بإنشاء حلقة تمر على جميع عناصر المصفوفة
for(let shape of shapes) {
// لها shape و تمرير الكائن الموجود في printShapeArea() هنا سيتم اسدعاء الدالة
printShapeArea(shape);
}
</script>
</body>
</html>
نتيجة التشغيل:
Rectangle area = 12