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

التدريب العملي 15: شكل مجرد بدائرة ومستطيل

Shape مجرد بدالتين مجردتين ودالتين عاديتين للون.

«abstract»Shape CircleRectangleلا new Shape()

من الدرس 10. التجريد Abstraction · كل التدريبات

١نص المسألة

أنشئ كلاسًا مجردًا Shape فيه خاصية اللون مع دالتي get و set عاديتين، ودالتين مجردتين getArea و getPerimeter. ثم أنشئ Circle و Rectangle يرثانه ويكتبان الدالتين المجردتين، واستخدم متغيرًا من نوع Shape لحساب مساحة كل شكل ومحيطه.

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

  1. public abstract class Shape: الخاصية private String color مع getColor و setColor.
  2. الدالتان المجردتان: public abstract double getArea(); و public abstract double getPerimeter();
  3. Circle extends Shape: المساحة Math.PI * r * r، والمحيط Math.PI * 2 * r.
  4. Rectangle extends Shape: المساحة width * height، والمحيط 2 * (width + height).
  5. في Main: Shape s = new Circle(5) واطبع المساحة والمحيط، ثم s = new Rectangle(4, 6) واطبعهما.
  6. جرّب Shape s = new Shape(); ولاحظ أنه خطأ لأن الكلاس مجرد.

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

في NetBeans

  1. أنشئ مشروع Lab15 بأربعة كلاسات.
  2. جرّب إزالة // من السطر Shape s = new Shape(); ولاحظ خطأ الترجمة.
  3. جرّب حذف getPerimeter من Circle ولاحظ أن المترجِم يُلزمك بها.

في OneCompiler

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

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

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

Output – (run)×
run:
Circle area: 78.53981633974483
Circle perimeter: 31.41592653589793
Rectangle area: 24.0
Rectangle perimeter: 20.0
BUILD SUCCESSFUL (total time: 0 seconds)

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

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

👁 اعرض الحل المقترح
package lab15; public abstract class Shape {    private String color;    // دالة عادية    public String getColor() {        return color;    }    // دالة عادية    public void setColor(String color) {        this.color = color;    }     // دالة بدون جسم أي مجردة    public abstract double getArea();     // دالة بدون جسم أي مجردة    public abstract double getPerimeter(); }
package lab15; public 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 double getPerimeter() {        return Math.PI * 2 * radius;    }}
package lab15; public class Rectangle extends Shape{    private double width, height;     public Rectangle(double width, double height) {        this.width = width;        this.height = height;    }     @Override    public double getArea() {        return width * height;    }     @Override    public double getPerimeter() {       return 2 * (width + height);    }}
package lab15;public class Main {     public static void main(String[] args) {        // Shape is abstract; cannot be instantiated        // الكلاس مجرد: فلا يمكن إنشاء نسخة منه         // Shape s = new Shape();         Shape s = new Circle(5);        s.setColor("red");        System.out.println("Circle area: " + s.getArea());        System.out.println("Circle perimeter: " + s.getPerimeter());         s = new Rectangle(4, 6);          System.out.println("Rectangle area: " + s.getArea());        System.out.println("Rectangle perimeter: " + s.getPerimeter());    } }
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
«abstract»ShapeCircleRectangleMain
«abstract»Shape- color : String+ getColor() : String+ setColor(color : String) : void+ getArea() : double+ getPerimeter() : doubleCircle- radius : double+ Circle(radius : double)+ getArea() : double+ getPerimeter() : doubleRectangle- width : double- height : double+ Rectangle(width : double, height : double)+ getArea() : double+ getPerimeter() : doubleMain+ main(args : String[]) : void

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

Output – Lab15 (run)×
run:
Circle area: 78.53981633974483
Circle perimeter: 31.41592653589793
Rectangle area: 24.0
Rectangle perimeter: 20.0
BUILD SUCCESSFUL (total time: 0 seconds)

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

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

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

1) لماذا عرّفنا الكلاس Shape في هذا التدريب بالكلمة abstract؟
2) ماذا يحدث إذا أزلنا علامة التعليق من السطر
snippet
Shape s = new Shape();
3) ما الذي يميز الدالة
snippet
public abstract double getArea();
4) لماذا لم نكتب الدالتين getColor و setColor في الكلاسين Circle و Rectangle؟
5) ماذا يحدث إذا حذفنا الدالة getPerimeter من الكلاس Circle؟
6) في الكود
snippet
Shape s = new Circle(5);
ما نوع الكائن الذي يشير إليه المتغير s فعليًّا؟
7) ما ناتج السطر الأخير في البرنامج
snippet
System.out.println("Rectangle perimeter: " + s.getPerimeter());
إذا كان المستطيل Rectangle(4, 6)؟
8) أي مما يلي صحيح عن الكلاس المجرد Shape في هذا التدريب؟
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».