🧪 التدريب العملي الوحدة 5: البرمجة الشيئية · الدرس 15 من 17
تدريب عملي

التدريب العملي 57: مصفوفة الأشكال

Shape بدالتين، وثلاثة أبناء، ومصفوفة تمرّ عليها for-each.

Shape[] shapes[0][1][2] getArea()78.524.010.5

من الدرس 15. تعدد الأشكال والتجريد والواجهات · كل التدريبات

١نص المسألة

أنشئ كلاس Shape بدالتين getArea و displayType، وثلاثة كلاسات ترثه: Circle و Rectangle و Triangle، كل منها يعيد كتابة الدالتين ويعيد كتابة toString لعرض بياناته. خزّن ثلاثة أشكال في مصفوفة من نوع Shape واطبع نوع كل شكل وبياناته ومساحته.

٢الخوارزمية المقترحة

أ) تصميم الكلاسات

  1. الكلاس Shape (الأب): دالة getArea تعيد 0، ودالة displayType تطبع نوعًا عامًّا
  2. الكلاس Circle يرث Shape: خاصية نصف القطر، والمساحة = π × نصف القطر²
  3. الكلاس Rectangle يرث Shape: العرض والارتفاع، والمساحة = العرض × الارتفاع
  4. الكلاس Triangle يرث Shape: القاعدة والارتفاع، والمساحة = 0.5 × القاعدة × الارتفاع
  5. كل ابن يعيد كتابة displayType و toString ليطبع نوعه وبياناته

ب) خطوات البرنامج الرئيسي

  1. ابدأ
  2. أنشئ مصفوفة من نوع Shape فيها: دائرة 5، ومستطيل 4 × 6، ومثلث 3 × 7
  3. كرّر على كل شكل في المصفوفة:
  4. اطبع نوعه
  5. اطبع بياناته
  6. اطبع مساحته
  7. توقف

٣خطوات التطبيق

في NetBeans

  1. أنشئ مشروع lab57 بخمسة كلاسات.
  2. لاحظ toString(): دالة موروثة من الكلاس Object نعيد كتابتها لتعرض بيانات الكائن.

في OneCompiler

  1. افتح OneCompiler من زر «▶ شغّل المشروع» أسفل الحل، أو من موقع onecompiler.com/java.
  2. في OneCompiler تُكتب كل الكلاسات في ملف واحد Main.java؛ زر التشغيل يجمعها لك تلقائيًّا.
  3. إذا كان البرنامج يقرأ من لوحة المفاتيح، فاكتب المدخلات في خانة STDIN التي تظهر تحت الكود في محرّر OneCompiler، ثم اضغط Run.

٤المخرجات المطلوبة

نفّذ برنامجك، ويجب أن تظهر المخرجات التالية:

Output – (run)×
run:
This is a Circle.
Circle(radius=5.0)
Area = 78.53981633974483
--------------------
This is a Rectangle.
Rectangle(width=4.0, height=6.0)
Area = 24.0
--------------------
This is a Triangle.
Triangle(base=3.0, height=7.0)
Area = 10.5
--------------------
BUILD SUCCESSFUL (total time: 0 seconds)

٥الحل المقترح

حاول بنفسك أولًا، ثم قارن حلّك بالحل المقترح (كود التدريب من مذكرة العملي):

👁 اعرض الحل المقترح
Shape+ getArea() : double+ displayType() : voidCircle- radius : double+ getArea() : double+ displayType() : void+ toString() : StringRectangle- width : double- height : double+ getArea() : double+ displayType() : void+ toString() : StringTriangle- base : double- height : double+ getArea() : double+ displayType() : void+ toString() : String
🧩 ثلاثة أبناء يعيدون كتابة دوال الأب. في الحلقة، s من نوع Shape لكنه يحمل كل مرة كائنًا مختلفًا.
+ public- private# protected~ defaultمسطّر: staticمائل: abstract
package lab57; public class Shape {     public double getArea() {        // القيمة الافتراضية        return 0;    }     public void displayType() {        System.out.println("This is a shape.");    } }
package lab57;class Circle extends Shape {    private double radius;     public Circle(double radius) {        this.radius = radius;    }     @Override    public double getArea() {        return Math.PI * radius * radius;    }     @Override    public void displayType() {        System.out.println("This is a Circle.");    }     @Override    public String toString() {        return "Circle(" + "radius=" + radius + ')';    }}
package lab57;class Triangle extends Shape {    private double base;    private double height;     public Triangle(double base, double height) {        this.base = base;        this.height = height;    }    @Override    public double getArea() {        return 0.5 * base * height;    }    @Override    public void displayType() {        System.out.println("This is a Triangle.");    }     @Override    public String toString() {        return "Triangle(" + "base=" + base + ", height=" + height + ')';    }}
package lab57;class Rectangle extends Shape {    private double width;    private double height;     public Rectangle(double width, double height) {        this.width = width;        this.height = height;    }    @Override    public double getArea() {        return width * height;    }    @Override    public void displayType() {        System.out.println("This is a Rectangle.");    }    @Override    public String toString() {        return "Rectangle(" + "width=" + width + ", height=" + height + ')';    }}
package lab57; public class Main {     public static void main(String[] args) {        Shape[] shapes = {            new Circle(5),            new Rectangle(4, 6),            new Triangle(3, 7)        };         for (Shape s : shapes) {            s.displayType();            System.out.println(s.toString());            System.out.println("Area = " + s.getArea());            System.out.println("--------------------");        }    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
ShapeCircleTriangleRectangleMain
Shape+ getArea() : double+ displayType() : voidCircle- radius : double+ Circle(radius : double)+ getArea() : double+ displayType() : void+ toString() : StringTriangle- base : double- height : double+ Triangle(base : double, height : double)+ getArea() : double+ displayType() : void+ toString() : StringRectangle- width : double- height : double+ Rectangle(width : double, height : double)+ getArea() : double+ displayType() : void+ toString() : StringMain+ main(args : String[]) : void

ملفات المشروع في تبويبات كما في NetBeans. زر التشغيل يجمعها في ملف واحد ليعمل على OneCompiler.

Output – lab57 (run)×
run:
This is a Circle.
Circle(radius=5.0)
Area = 78.53981633974483
--------------------
This is a Rectangle.
Rectangle(width=4.0, height=6.0)
Area = 24.0
--------------------
This is a Triangle.
Triangle(base=3.0, height=7.0)
Area = 10.5
--------------------
BUILD SUCCESSFUL (total time: 0 seconds)

أسئلة المناقشة

أسئلة مناقشة على التدريب 14. إجاباتك تُحفظ تلقائيًّا على هذا الجهاز؛ أجب ثم اضغط «صحّح ورقتي».

1السؤال الأول: اختر الإجابة الصحيحة

1) ما الهدف من تعريف الدالة getArea() في الكلاس Shape بالقيمة 0؟
2) عند تنفيذ البرنامج، كم مرة يتم استدعاء الدالة displayType()؟
3) عند تنفيذ s.getArea() في الحلقة داخل Main، أي دالة سيتم استدعاؤها؟
4) ما نوع تعدد الأشكال المستخدم في هذا المثال؟
5) عند تنفيذ s.displayType()، لماذا تختلف المخرجات بين الكائنات؟
6) ماذا تفعل الكلمة المفتاحية @Override في الكود؟
7) عند طباعة System.out.println(s.toString()); ماذا يحدث؟
8) ما الفائدة من استخدام مصفوفة من نوع Shape لتخزين كائنات من أنواع مختلفة؟
9) أي من الجمل التالية صحيحة بخصوص الدالة getArea() في الكلاس Triangle؟
10) ماذا يحدث لو لم نكتب التعليمة @Override فوق الدالة getArea()؟
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».