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

التدريب العملي 42: التحميل الزائد ثم تغيير شكل الكائن

الجزء الأول: Calc بدالتي sum. الجزء الثاني: متغير واحد emp يأخذ ثلاثة أشكال.

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

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

١نص المسألة

طبّق نوعي تعدد الأشكال: الثابت بدالتين sum في كلاس Calc (تحميل زائد)، والديناميكي بكلاس Employee راتبه 1500 وكلاسين يعيدان كتابة getSalary: HourlyEmployee (40 ساعة × 150) و SalariedEmployee (راتب الأب + 2500 − 100).

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

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

  1. الكلاس Calc (تعدد الأشكال الثابت):
  2. دالتان sum: الأولى تجمع عددين، والثانية تجمع ثلاثة
  3. الكلاس Employee: راتب 1500، ودالة getSalary تعيده
  4. الكلاس HourlyEmployee يرث Employee (تعدد الأشكال الديناميكي):
  5. يعيد كتابة getSalary: عدد الساعات 40 × أجر الساعة 150
  6. الكلاس SalariedEmployee يرث Employee:
  7. يعيد كتابة getSalary: راتب الأب + المكافأة 2500 − الخصم 100

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

  1. ابدأ
  2. استدعِ sum بعددين، ثم بثلاثة أعداد
  3. أنشئ متغيرًا واحدًا emp من نوع Employee يحمل كائن Employee، واطبع راتبه
  4. اجعل emp يحمل كائن HourlyEmployee، واطبع راتبه
  5. اجعل emp يحمل كائن SalariedEmployee، واطبع راتبه
  6. المتغير نفسه أعطى ثلاثة رواتب مختلفة حسب الكائن
  7. توقف

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

في NetBeans

  1. أنشئ مشروع Lab42 وكلاس Calc وMain.
  2. أضف Employee و HourlyEmployee و SalariedEmployee.
  3. لكتابة getSalary في الابن: Insert Code‏ ← ‏Override Method‏ ← ‏حدّد getSalary‏ ← ‏Generate.

في OneCompiler

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

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

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

Output – (run)×
run:
Sum of two numbers: 30
Sum of three numbers: 60
Salary: 1500.0
Salary: 6000.0
Salary: 3900.0
BUILD SUCCESSFUL (total time: 0 seconds)

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

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

👁 اعرض الحل المقترح
package lab42; public class Calc {     // Polymorphism: method overloading     public void sum(int x, int y) {        int s = x + y;        System.out.println("Sum of two numbers: " + s);    }     public void sum(int x, int y, int z) {        int s = x + y + z;        System.out.println("Sum of three numbers: " + s);    }}
package lab42; public class Employee {     private double salary = 1500;     public double getSalary() {        return salary;    }}
package lab42; public class HourlyEmployee extends Employee {     private int workingHours = 40;    private double hourRate = 150;     @Override    public double getSalary() {        return (workingHours * hourRate);    }}
package lab42; public class SalariedEmployee extends Employee {     private double bonus = 2500;    private double deductions = 100;     @Override    public double getSalary() {        return super.getSalary() + bonus - deductions;    }}
package lab42;public class Main {    public static void main(String[] args) {        Calc c = new Calc();        c.sum(20, 10);        c.sum(10, 20, 30);        //------------        Employee emp = new Employee();        System.out.println("Salary: " + emp.getSalary());        // نغيّر شكل الكائن        emp = new HourlyEmployee();        System.out.println("Salary: " + emp.getSalary());         emp = new SalariedEmployee();        System.out.println("Salary: " + emp.getSalary());    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
CalcEmployeeHourlyEmployeeSalariedEmployeeMain
Calc+ sum(x : int, y : int) : void+ sum(x : int, y : int, z : int) : voidEmployee- salary : double+ getSalary() : doubleHourlyEmployee- workingHours : int- hourRate : double+ getSalary() : doubleSalariedEmployee- bonus : double- deductions : double+ getSalary() : doubleMain+ main(args : String[]) : void

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

Output – Lab42 (run)×
run:
Sum of two numbers: 30
Sum of three numbers: 60
Salary: 1500.0
Salary: 6000.0
Salary: 3900.0
BUILD SUCCESSFUL (total time: 0 seconds)

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

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

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

1) ما نوع تعدد الأشكال المستخدم في الكلاس Calc؟
2) في الكود التالي:
snippet
c.sum(10, 20);c.sum(10, 20, 30);
كيف تعرف Java أي دالة يتم استدعاؤها؟
3) ما نوع تعدد الأشكال المستخدم في الكلاسات Employee و HourlyEmployee و SalariedEmployee؟
4) عند تنفيذ السطر التالي:
snippet
Employee emp = new HourlyEmployee();
ماذا يعني هذا؟
5) في السطر التالي:
snippet
System.out.println("Salary: " + emp.getSalary());
أي دالة getSalary() سيتم استدعاؤها؟
6) ماذا يُظهر هذا السطر من الكود:
snippet
emp = new SalariedEmployee();System.out.println("Salary: " + emp.getSalary());
7) عند استخدام الكلمة super في الكلاس SalariedEmployee داخل getSalary()، ماذا تفعل؟
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».