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

التدريب العملي 40: المبرمج يرث الموظف

Employee بخاصية salary محمية بشرط، و Programmer يرثه ويضيف لغات البرمجة.

EmployeeProgrammerManagerextends

من الدرس 13. الوراثة · كل التدريبات

١نص المسألة

أنشئ كلاس Employee فيه الاسم والعنوان وراتب private لا يقبل أقل من 4000. ثم أنشئ كلاس Programmer يرث Employee ويضيف مصفوفة لغات البرمجة ودالة تطبعها.

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

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

  1. الكلاس Employee:
  2. الخصائص: الاسم، والعنوان، والراتب (مخفي private)
  3. دالة تعيين الراتب: تقبله إذا كان 4000 فأكثر، وإلا تطبع رسالة خطأ
  4. الكلاس Programmer يرث Employee:
  5. يضيف قائمة لغات البرمجة
  6. ودالة تطبع اللغات

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

  1. ابدأ
  2. أنشئ مبرمجًا جديدًا
  3. أعطه الاسم Ali، والراتب 3999
  4. يُرفض الراتب لأنه أقل من 4000
  5. أعطه لغات البرمجة: Java و PHP و Python
  6. اطبع الاسم والراتب واللغات
  7. توقف

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

في NetBeans

  1. أنشئ مشروع lab40 بثلاثة كلاسات: Employee و Programmer و Main.
  2. في Programmer اكتب: public class Programmer extends Employee.
  3. لاحظ أن p.name و p.getSalary() موروثتان رغم أننا لم نكتبهما في Programmer.

في OneCompiler

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

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

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

Output – (run)×
run:
ERROR: salary must be >= 4000
name: Ali
salary: 0.0
Programming Languages:
Java
PHP
Python
BUILD SUCCESSFUL (total time: 0 seconds)

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

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

👁 اعرض الحل المقترح
Employee~ name : String~ address : String- salary : double+ getSalary() : double+ setSalary(salary : double) : voidProgrammer- progLangs : String[]+ printProgLangs() : void+ setProgLangs(p : String[]) : void
🧩 Programmer يرث Employee. لاحظ أن salary خاصة (−) فلا يصل إليها الابن إلا عبر getSalary و setSalary.
+ public- private# protected~ defaultمسطّر: staticمائل: abstract
package lab40;public class Employee {    String name;    String address;    private double salary;     public double getSalary() {        return salary;    }     public void setSalary(double salary) {        if(salary >= 4000)            this.salary = salary;        else            System.out.println("ERROR: salary must be >= 4000");    }}
package lab40; public class Programmer extends Employee {     private String[] progLangs;     public void printProgLangs() {        for (int i = 0; i < progLangs.length; i++) {            System.out.println(progLangs[i]);        }    }     public void setProgLangs(String[] progLangs) {        this.progLangs = progLangs;    } }
package lab40; public class Main {     public static void main(String[] args) {        Programmer p = new Programmer();        p.name = "Ali";        p.setSalary(3999);        String[] progLangs = {"Java", "PHP", "Python"};        p.setProgLangs(progLangs);        System.out.println("name: " + p.name);        System.out.println("salary: " + p.getSalary());        System.out.println("Programming Languages:");        p.printProgLangs();    }}
مخطط المشروع مستخرج من الكود. انقر على أي كلاس لفتح كوده.
EmployeeProgrammerMain
Employee~ name : String~ address : String- salary : double+ getSalary() : double+ setSalary(salary : double) : voidProgrammer- progLangs : String[]+ printProgLangs() : void+ setProgLangs(progLangs : String[]) : voidMain+ main(args : String[]) : void

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

Output – lab40 (run)×
run:
ERROR: salary must be >= 4000
name: Ali
salary: 0.0
Programming Languages:
Java
PHP
Python
BUILD SUCCESSFUL (total time: 0 seconds)

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

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

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

1) ما نوع العلاقة بين الكلاس Programmer والكلاس Employee؟
2) لماذا لا يمكن الوصول مباشرة إلى المتغير salary من كائن Programmer؟
3) ما الطريقة الصحيحة لتغيير قيمة salary من خارج الكلاس؟
4) عند تنفيذ
snippet
 p.setSalary(3999);
ما النتيجة؟
5) بعد محاولة تعيين salary بـ 3999، ماذا ستطبع الدالة getSalary()؟
6) لماذا استطعنا الوصول إلى name مباشرة في الكلاس Main رغم أنه موجود في الكلاس Employee؟
7) ما وظيفة الدالة printProgLangs() في الكلاس Programmer
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».