📝 التقييم الوحدة 5: البرمجة الشيئية · الدرس 15 من 17
تقييم

تقييم الدرس 15: تعدد الأشكال والتجريد والواجهات

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

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

← العودة إلى الدرس 15: تعدد الأشكال والتجريد والواجهات

أسئلة التقييم

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

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

1) ماذا نسمي عملية استدعاء الدالة المناسبة في وقت التنفيذ بناءً على نوع الكائن؟
2) أكمل الفراغ: الكلمة Poly في Polymorphism تعني ........
3) إذا كان الكلاس Circle يرث من Shape، أي سطر صحيح؟
4) أكمل الفراغ: التعليق الصحيح الذي يُكتب قبل الدالة المعاد كتابتها هو ........
5) تأمل الكود التالي، ماذا سيكون الناتج عند تنفيذه؟
snippet
class Animal{    void speak() { System.out.println("Animal"); }} class Dog extends Animal{    @Override    void speak() { System.out.println("Dog"); }} public class Main{    public static void main(String[] args)    {        Animal a = new Dog();        a.speak();    }}
6) ما فائدة استخدام التجريد (Abstraction) في البرمجة الكائنية؟
7) ما الذي يميز الدوال المجردة (abstract methods)؟
8) أكمل الفراغ: الكلاس المجرد abstract class ........

2السؤال الثاني: صح أم خطأ

1) JVM هو الذي يحدّد الدالة المنفّذة في تعدد الأشكال الديناميكي. صح أم خطأ؟
الصواب: صح
2) مصفوفة من نوع الكلاس الأب يمكن أن تحتوي كائنات من الكلاسات الأبناء. صح أم خطأ؟
الصواب: صح
3) التعليق @Override يجعل المترجِم يتحقق من صحة إعادة الكتابة. صح أم خطأ؟
الصواب: صح
4) الكلاس المجرد abstract يمكن أن يحتوي دوالًا عادية. صح أم خطأ؟
الصواب: صح
5) الكلاس الابن غير المجرد يجب أن يكتب جميع الدوال المجردة التي ورثها. صح أم خطأ؟
الصواب: صح
6) في مخطط UML يُكتب اسم الكلاس المجرد بخط مائل. صح أم خطأ؟
الصواب: صح

3السؤال الثالث: أكمل الفراغات

1) تعدد الأشكال الثابت يُحدَّد وقت .

💡 تعدد الأشكال الثابت يُحدَّد وقت ___ أي قبل التنفيذ.

الإجابة: الترجمة

2) تعدد الأشكال الديناميكي يتحقق بـ .

💡 إعادة كتابة الدالة في الابن، بالإنجليزية.

الإجابة: Overriding

3) الربط وقت الترجمة يُسمّى الربط .

💡 الربط وقت الترجمة يُسمّى الربط ___ .

الإجابة: المبكر

4) إنشاء مصفوفة من 3 أشكال: Shape[] s = new Shape[];

💡 عدد عناصر المصفوفة.

الإجابة: 3

5) الكلمة التي تجعل الكلاس مجردًا: .

💡 الكلمة التي تُكتب قبل class لتجعله مجردًا.

الإجابة: abstract

6) المبادئ الأربعة: التغليف والتجريد والوراثة و .

💡 المبدأ الرابع: Polymorphism.

الإجابة: تعدد الأشكال

7) العقد التجريدي الذي ينفّذه الكلاس: .

💡 عقد تجريدي ستتعرّف عليه لاحقًا.

الإجابة: interface

8) سهم «ينفّذ» في UML يكون برأس مثلث.

💡 السهم ليس متصلًا.

الإجابة: متقطعا

9) أكمل الفراغ: الواجهة بالإنجليزية .

💡 تسعة أحرف إنجليزية، تبدأ بـ inter.

الإجابة: interface

10) أكمل الفراغ: نكتب بعد اسم الكلاس الكلمة ثم اسم الواجهة لتنفيذها.

💡 كلمة تعني «ينفّذ».

الإجابة: implements

11) أكمل الفراغ: في UML يُكتب فوق اسم الواجهة «».

💡 الكلمة نفسها التي نعرّف بها الواجهة.

الإجابة: interface

4السؤال الرابع: التوصيل

طابِق كل عنصر في العمود (أ) بما يناسبه في العمود (ب):

  1. 1) abstract class
  2. 2) abstract method
  3. 3) interface
  4. 4) implements
  5. 5) extends
  1. أ. دالة بلا جسم.
  2. ب. كلاس لا يُنشأ منه كائن.
  3. ج. يرث كلاسًا.
  4. د. ينفّذ واجهة.
  5. هـ. عقد تجريدي.
المفتاح: (1) ب (2) أ (3) هـ (4) د (5) ج

طابِق كل عنصر في العمود (أ) بما يناسبه في العمود (ب):

  1. 1) interface
  2. 2) implements
  3. 3) extends
  4. 4) abstract class
  1. أ. تنفيذ واجهة.
  2. ب. وراثة كلاس.
  3. ج. كلاس مجرد فيه دوال عادية ومجردة.
  4. د. قائمة دوال بلا أجسام.
المفتاح: (1) د (2) أ (3) ب (4) ج

5السؤال الخامس: أسئلة عملية

1) تتبّع الناتج:

snippet
class Shape {    double area() { return 0; }}class Sq extends Shape {    double s;    Sq(double s) { this.s = s; }    double area() { return s * s; }}class Ci extends Shape {    double r;    Ci(double r) { this.r = r; }    double area() { return 3 * r * r; }} public class Main{    public static void main(String[] args)    {        Shape[] arr = { new Sq(2), new Ci(1) };        for (Shape x : arr)            System.out.println(x.area());    }}
الناتج الصحيح:
Output×
4.0
3.0

2) تتبّع الناتج:

snippet
class Shape{    String name() { return "Shape"; }} class Square extends Shape{    @Override    String name() { return "Square of " + super.name(); }} public class Main{    public static void main(String[] args)    {        System.out.println(new Square().name());    }}
الناتج الصحيح:
Output×
Square of Shape
3)

أكمل الكود من التدريب 13: الكلاس HourlyEmployee يعيد كتابة دالة الراتب

public class HourlyEmployee extends Employee {    private int workingHours = 40;    private double hourRate = 150;        public double () {        return (workingHours * hourRate);    }}Employee emp = new ();System.out.println("Salary: " + emp.getSalary());
الإجابة: (1) @Override · (2) getSalary · (3) HourlyEmployee

4) تتبّع الناتج:

snippet
abstract class Animal{    abstract String sound();    void say() { System.out.println("I say " + sound()); }} class Cow extends Animal{    String sound() { return "Moo"; }} public class Main{    public static void main(String[] args)    {        Animal a = new Cow();        a.say();    }}
الناتج الصحيح:
Output×
I say Moo

5) اكتب كلاسًا مجردًا Employee فيه دالة مجردة double pay()، وكلاس Intern يرثه ويعيد 3000، ثم اطبع pay() لكائن Intern.

الحل النموذجي:
Employee.java
abstract class Employee{    abstract double pay();} class Intern extends Employee{    double pay()    {        return 3000;    }} public class Main{    public static void main(String[] args)    {        Employee e = new Intern();        System.out.println(e.pay());    }}
Output – JavaApplication (run)×
run:
3000.0
BUILD SUCCESSFUL (total time: 0 seconds)
قارن إجابتك بالحل:
6)

سؤال برمجي حول Abstract و Polymorphism
لدينا كلاس مجرّد (abstract) اسمه Person يحتوي على: متغير name ودالة بناء (constructor) يستقبل الاسم
ودالة مجرّدة اسمها work
تم إنشاء كلاس Student يرث من Person ويعيد تعريف الدالة work بحيث تطبع مثل ما يلي: Student Ali is studying وتم إنشاء كلاس Teacher يرث من Person ويعيد تعريف الدالة work بحيث تعرض: Teacher Mohammed is teaching. في الدالة main:
أنشئ كائنًا من Student وآخر من Teacher كعناصر للمصفوفة التي من نوع Person (أي باستخدام polymorphism).
وتم استدعِ الدالة work لكلا الكائنين.

  class Person {    String name;    Person(String name) {        this.name = name;    }     void work();}class Student    Person {    Student(String name) {        (name);    }    @Override    void    () {        System.out.println("Student " + name + " is studying.");    }}class Teacher    Person {    Teacher(String name) {        super(name);    }    @Override    void    () {        System.out.println("Teacher " + name + " is teaching.");    }}public class Main {    public static void main(String[] args) {            p[ ] = { new Student("Ali"), new Teacher("Mohammed") };        p[0].work();        p[1].work();    }}
الإجابة: (1) abstract · (2) abstract · (3) extends · (4) super · (5) work · (6) extends · (7) work · (8) Person

7) تتبّع الناتج:

snippet
interface Swimmer { void swim(); }interface Flyer { void fly(); }class Duck implements Swimmer, Flyer {    public void swim() { System.out.println("swim"); }    public void fly() { System.out.println("fly"); }}public class Main {    public static void main(String[] args) {        Duck d = new Duck();        d.fly();        d.swim();    }}
الناتج الصحيح:
Output×
fly
swim

8) اكتب واجهة اسمها Drawable فيها الدالة draw()، وكلاسًا Circle ينفّذها ويطبع «Drawing a circle»، ثم استدعها عبر متغير من نوع Drawable.

الحل النموذجي:
Circle.java
interface Drawable {    void draw();} class Circle implements Drawable {    public void draw() {        System.out.println("Drawing a circle");    }} public class Main {    public static void main(String[] args) {        Drawable d = new Circle();        d.draw();    }}
Output – JavaApplication (run)×
run:
Drawing a circle
BUILD SUCCESSFUL (total time: 0 seconds)
قارن إجابتك بالحل:
9)

أكمل كود الواجهة Printable وتنفيذها في الكلاس Book:

public  Printable {    void printInfo();}public class Book  Printable {        public void printInfo() {        System.out.println("Book: " + title);    }}
الإجابة: (1) interface · (2) implements · (3) @Override
أجب عن الأسئلة ثم اضغط «صحّح ورقتي».