0Pricing
Java Academy · درس

السلوكيات متعددة الأشكال

استخدم تعدد الأشكال لطباعة الأشكال المختلطة وفرزها وتجميعها. اجعل الخوارزميات صغيرة وسهلة القراءة على الهاتف.

السلوكيات متعددة الأشكال درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 3. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 3 دروس في المجموع.

نظرة عامة

السلوكيات متعددة الأشكال تتيح لنا التعامل مع جميع الأشكال بالطريقة نفسها، بينما ينفذ كل منها حساباته الخاصة. سنقوم بما يلي: (1) طباعة قائمة مختلطة بطريقة موحّدة، (2) الفرز حسب المساحة، و(3) حساب الإجماليات باستخدام حلقة واحدة.

قائمة التحقق من API الأساسية

API الأساسية تحافظ على الإجراءات المستخدمة في كل مكان:

  • area() وperimeter() — يجب أن تنفذهما كل الأشكال.
  • دالة مساعدة صغيرة اختيارية مثل label() أو info() للطباعة المنسّقة.
  • أبقوا الحقول داخل الأشكال الفعلية.

الشيفرة: طباعة موحّدة

الطباعة الموحّدة: تستخدم الحلقة واجهة Shape فقط. وينفذ كل كائن تطبيقه الخاص للحسابات.

public class Main {
  static abstract class Shape {
    abstract double area();
    abstract double perimeter();
    String label() { return getClass().getSimpleName(); }
    String info() { return String.format("area=%.2f, per=%.2f", area(), perimeter()); }
  }
  static class Circle extends Shape {
    double r; Circle(double r) { this.r = (r < 0) ? 0 : r; }
    double area() { return Math.PI * r * r; }
    double perimeter() { return 2 * Math.PI * r; }
  }
  static class Rectangle extends Shape {
    double w, h; Rectangle(double w, double h) { this.w = Math.max(0, w); this.h = Math.max(0, h); }
    double area() { return w * h; }
    double perimeter() { return 2 * (w + h); }
  }
  public static void main(String[] args) {
    Shape[] list = { new Circle(2.0), new Rectangle(3.0, 4.0), new Circle(1.0) };
    for (int i = 0; i < list.length; i = i + 1) {
      Shape s = list[i];
      System.out.println(s.label() + " -> " + s.info());
    }
  }
}

الفرز حسب المساحة (الفكرة)

فكرة الفرز:

  • المقارنة: قارنوا قيمة area() لشكلين.
  • بالنسبة إلى البيانات الصغيرة، يكفي فرز بسيط من نوع bubble/selection.
  • استخدموا دوال Shape فقط؛ من دون فحص للنوع.

الشيفرة: الفرز حسب المساحة

الفرز البسيط: يتطلب استدعاء area() فقط. لا يوجد فحص للنوع؛ وهذه هي قوة تعدد الأشكال.

public class Main {
  static abstract class Shape { abstract double area(); abstract double perimeter(); String label(){ return getClass().getSimpleName(); } }
  static class Circle extends Shape { double r; Circle(double r){ this.r = Math.max(0, r);} double area(){return Math.PI*r*r;} double perimeter(){return 2*Math.PI*r;} }
  static class Rectangle extends Shape { double w,h; Rectangle(double w,double h){ this.w=Math.max(0,w); this.h=Math.max(0,h);} double area(){return w*h;} double perimeter(){return 2*(w+h);} }

  // Very small bubble sort for beginners (ascending by area)
  static void sortByArea(Shape[] arr){
    for(int pass=0; pass<arr.length-1; pass=pass+1){
      for(int i=0; i<arr.length-1; i=i+1){
        if(arr[i].area() > arr[i+1].area()){
          Shape tmp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = tmp;
        }
      }
    }
  }

  public static void main(String[] args) {
    Shape[] a = { new Rectangle(3,4), new Circle(2), new Circle(1) };
    sortByArea(a);
    for(int i=0;i<a.length;i=i+1){
      System.out.println(a[i].label() + " area=" + String.format("%.2f", a[i].area()));
    }
  }
}

الشيفرة: المساحة الإجمالية

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

public class Main {
  static abstract class Shape { abstract double area(); abstract double perimeter(); }
  static class Circle extends Shape { double r; Circle(double r){ this.r=Math.max(0,r);} double area(){return Math.PI*r*r;} double perimeter(){return 2*Math.PI*r;} }
  static class Rectangle extends Shape { double w,h; Rectangle(double w,double h){ this.w=Math.max(0,w); this.h=Math.max(0,h);} double area(){return w*h;} double perimeter(){return 2*(w+h);} }

  static double totalArea(Shape[] arr){
    double sum = 0.0;
    for(int i=0;i<arr.length;i=i+1){
      sum = sum + arr[i].area(); // polymorphic call
    }
    return sum;
  }

  public static void main(String[] args) {
    Shape[] list = { new Circle(1), new Rectangle(2,3), new Circle(0.5) };
    System.out.println("Total area = " + String.format("%.2f", totalArea(list)));
  }
}

التحقق من أسلوب تعدد الأشكال

تحقق سريع: أي أسلوب في كتابة الشيفرة يستخدم تعدد الأشكال على أفضل نحو هنا؟

مراجعة

مراجعة: كتبنا باستخدام API نفسها، وأنتج كل شكل نتيجته الخاصة. عملت عمليات مثل الطباعة والفرز والإجمالي باستخدام شيفرة موحّدة.

الأسئلة الشائعة

هل درس «السلوكيات متعددة الأشكال» مجاني؟

نعم — نص درس «السلوكيات متعددة الأشكال» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 3 دروس في المجموع.

ماذا ستتعلم في «السلوكيات متعددة الأشكال»؟

استخدم تعدد الأشكال لطباعة الأشكال المختلطة وفرزها وتجميعها. اجعل الخوارزميات صغيرة وسهلة القراءة على الهاتف. تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 3.

كم من الوقت يستغرق درس «السلوكيات متعددة الأشكال»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. التصميم
  2. التنفيذ
  3. السلوكيات متعددة الأشكال
← العودة إلى Java Academy