فهرس المقرر
تدريب عملي

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

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

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

من الدرس 9. تعدد الأشكال Polymorphism · كل التدريبات

١نص المسألة

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

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

  1. Shape: getArea تعيد 0، و displayType تطبع This is a shape.
  2. Circle: الخاصية radius، والمساحة Math.PI * radius * radius.
  3. Rectangle: width و height، والمساحة width * height.
  4. Triangle: base و height، والمساحة 0.5 * base * height.
  5. في كل كلاس ابن أعد كتابة displayType و toString.
  6. في Main: مصفوفة Shape[] فيها Circle(5) و Rectangle(4, 6) و Triangle(3, 7)، وحلقة for-each تستدعي الدوال الثلاث.

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

في NetBeans

  1. أنشئ مشروع lab14 بخمسة كلاسات.
  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 lab14; public class Shape {     public double getArea() {        // القيمة الافتراضية        return 0;    }     public void displayType() {        System.out.println("This is a shape.");    } }
package lab14;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 lab14;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 lab14;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 lab14; 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 – lab14 (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()؟
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».