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

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

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

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

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

١نص المسألة

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

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

  1. Calc: sum(int x, int y) و sum(int x, int y, int z) تطبع كل منهما المجموع.
  2. Employee: private double salary = 1500 والدالة getSalary.
  3. HourlyEmployee extends Employee: @Override getSalary تعيد workingHours * hourRate.
  4. SalariedEmployee extends Employee: @Override getSalary تعيد super.getSalary() + bonus - deductions.
  5. في Main: استدعِ sum مرتين، ثم متغير واحد emp من نوع Employee يأخذ الأشكال الثلاثة، واطبع الراتب كل مرة.

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

في NetBeans

  1. أنشئ مشروع Lab13 وكلاس 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 lab13; 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 lab13; public class Employee {     private double salary = 1500;     public double getSalary() {        return salary;    }}
package lab13; public class HourlyEmployee extends Employee {     private int workingHours = 40;    private double hourRate = 150;     @Override    public double getSalary() {        return (workingHours * hourRate);    }}
package lab13; public class SalariedEmployee extends Employee {     private double bonus = 2500;    private double deductions = 100;     @Override    public double getSalary() {        return super.getSalary() + bonus - deductions;    }}
package lab13;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 – Lab13 (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()، ماذا تفعل؟
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».