Home
Module 4
Pillar 3 of OOP

Polymorphism

تعدد الأشكال - نفس الـ interface، سلوكيات مختلفة

🎭إيه هو تعدد الأشكال Polymorphism؟

🎮 تشبيه الريموت

فكر في زرار "Play" ▶️ في الريموت:

  • • على التلفزيون → بيشغل القناة
  • • على CD Player → بيشغل الأغنية
  • • على YouTube → بيشغل الفيديو

نفس الزرار (play)، لكن النتيجة مختلفة حسب الجهاز! 🎯

✅ أنواع Polymorphism

  • Compile-time - Method Overloading (نفس الاسم، parameters مختلفة)
  • Runtime - Method Overriding (نفس الـ method في child)

📌 الفايدة

  • • كود مرن وقابل للتوسع
  • • التعامل مع Objects مختلفة بنفس الطريقة
  • • Open/Closed Principle

🔷 نفس الـ Interface، سلوكيات مختلفة

«interface»ShapecalculateArea()CirclecalculateArea()→ π × r²🟦RectanglecalculateArea()→ width × height🔺TrianglecalculateArea()→ ½ × b × h
💡 كلهم عندهم calculateArea() لكن كل واحد بيحسبها بطريقته

📦Interface & Implementation

shapes.ts
// Interface - العقد
interface Shape {
  calculateArea(): number;
  getInfo(): string;
}

// Implementation 1 - Circle
class Circle implements Shape {
  constructor(private radius: number) {}

  calculateArea(): number {
    return Math.PI * this.radius ** 2;
  }

  getInfo(): string {
    return `Circle with radius ${this.radius}`;
  }
}

// Implementation 2 - Rectangle
class Rectangle implements Shape {
  constructor(
    private width: number,
    private height: number
  ) {}

  calculateArea(): number {
    return this.width * this.height;
  }

  getInfo(): string {
    return `Rectangle ${this.width}×${this.height}`;
  }
}

// Polymorphism in action!
function printArea(shape: Shape): void {
  console.log(`Area: ${shape.calculateArea()}`);
}

const circle = new Circle(5);
const rect = new Rectangle(4, 6);

printArea(circle);  // Area: 78.54
printArea(rect);    // Area: 24

🔍 شرح كل جزء:

📋 الـ Interface - العقد

Shape بيقول: "أي shape لازم يكون عنده calculateArea() و getInfo()"

🔌 implements - التنفيذ

Circle implements Shape يعني Circle بيوعد إنه ينفذ كل حاجة في الـ interface

🔢 كل واحد بيحسب بطريقته

Circle بيستخدم π×r² والـ Rectangle بيستخدم width×height

✨ السحر - Polymorphism!

الـ printArea() بتاخد أي Shape - مش مهم نوعه! كل واحد هيشتغل بطريقته

🎮جرب بنفسك - حساب المساحة

اختار الشكل:

النتيجة:

shape.calculateArea()

78.54

square units

const shape = new Circle(5);

💡 لاحظ: كلهم بيستخدموا نفس الـ method اسمها calculateArea() - لكن كل واحد بيحسبها بطريقته!

📝 ملخص Polymorphism

🎭

One Interface

نفس الـ interface

🔀

Many Forms

سلوكيات مختلفة

📋

Interface

العقد اللي بيتنفذ

🏛️

Abstract

نص implementation