Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الأصناف المجردة (Abstract Classes)

جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 25 من 91.

الفئة المجردة (abstract class) هي فئة لا يمكن إنشاء مثيل لها مباشرة. فهي تعمل بمثابة مخطط للفئات الأخرى، حيث تحدد الأساليب (methods) التي يجب على الفئات التابعة (child classes) تنفيذها. يمكنك إنشاء فئة مجردة باستخدام الكلمة المفتاحية abstract.

<?php
abstract class Shape {
    protected $color;
    
    public function __construct($color) {
        $this->color = $color;
    }
    
    abstract public function calculateArea();
    
    public function getColor() {
        return $this->color;
    }
}

class Rectangle extends Shape {
    private $width;
    private $height;
    
    public function __construct($color, $width, $height) {
        parent::__construct($color);
        $this->width = $width;
        $this->height = $height;
    }
    
    public function calculateArea() {
        return $this->width * $this->height;
    }
}

$rect = new Rectangle("blue", 5, 3);
echo $rect->calculateArea();

المخرجات:

15

تعلن الفئة Shape عن طريقة مجردة calculateArea() دون تقديم تنفيذ لها. يجب على أي فئة ترث من Shape تنفيذ هذه الطريقة. لاحظ أن الفئات المجردة يمكن أن تحتوي أيضاً على طرق عادية مثل getColor() ترثها الفئات الفرعية مباشرة.

تحدد الدوال المجردة (Abstract methods) ما يجب على الفئة الفرعية القيام به، ولكن ليس الكيفية. يضمن هذا أن جميع الأشكال لديها دالة calculateArea() مع السماح لكل شكل بحساب مساحته بشكل مختلف.

نقطة رئيسية: تجمع الأصناف المجردة (Abstract classes) بين هيكل الوراثة والمتطلبات الإلزامية. استخدمها عندما ترغب في مشاركة الكود بين الأصناف ذات الصلة مع ضمان قيام كل صنف تابع (child class) بتنفيذ دوال (methods) معينة.

challenge icon

التحدي

سهل

لنقم ببناء نظام مشغل وسائط يوضح كيف تفرض الفئات المجردة (abstract classes) عقداً مع السماح لأنواع الوسائط المختلفة بتنفيذ سلوك التشغيل الخاص بها.

ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:

  • Media.php — قم بتعريف فئة مجردة باسم Media تعمل كمخطط لجميع أنواع الوسائط. يجب أن تحتوي على خاصية محمية (protected) باسم $title ومنشئ (constructor) يقبل العنوان ويقوم بتعيينه. قم بتضمين طريقة مجردة (abstract method) تسمى play() يجب على الفئات التابعة تنفيذها. أضف أيضاً طريقة عادية getTitle() تعيد العنوان — سيتم توريث هذه الطريقة الملموسة (concrete method) من قبل جميع الفئات التابعة.
  • Song.php — قم بتعريف فئة Song ترث من Media. قم بتضمين ملف Media في الأعلى. تضيف هذه الفئة خاصية $artist. يجب أن يقبل المنشئ العنوان والفنان — استخدم parent::__construct() للعنوان، ثم قم بتعيين الفنان بنفسك. قم بتنفيذ طريقة play() المطلوبة لتعيد "Playing song: [title] by [artist]".
  • Podcast.php — قم بتعريف فئة Podcast ترث من Media. قم بتضمين ملف Media في الأعلى. تضيف هذه الفئة خاصية $episode (عدد صحيح). يجب أن يقبل المنشئ العنوان ورقم الحلقة — استخدم parent::__construct() للعنوان، ثم قم بتعيين الحلقة. قم بتنفيذ طريقة play() المطلوبة لتعيد "Playing podcast: [title] - Episode [episode]".

في ملف main.php، قم بتضمين ملفي Song و Podcast. ستتلقى أربعة مدخلات: عنوان الأغنية، اسم الفنان، عنوان البودكاست، ورقم الحلقة (كسلسلة نصية لتحويلها إلى عدد صحيح). قم بإنشاء كائن Song وكائن Podcast بهذه القيم. اطبع نتيجة استدعاء play() على الأغنية أولاً، ثم على البودكاست، كل منهما في سطر مستقل.

يوضح هذا التحدي كيف تحدد الفئات المجردة عقداً — يجب أن يحتوي كل نوع من أنواع الوسائط على طريقة play()، ولكن كل نوع ينفذها بشكل مختلف. لا يمكن إنشاء كائن من الفئة المجردة Media مباشرة؛ فهي موجودة فقط لتوفير الهيكل والوظائف المشتركة لأبنائها.

ورقة مرجعية

الفئة المجردة (abstract class) هي فئة لا يمكن إنشاء كائن منها مباشرة. وهي تعمل كمخطط للفئات الأخرى، حيث تحدد الطرق (methods) التي يجب على الفئات التابعة تنفيذها. استخدم الكلمة المفتاحية abstract لإنشاء فئة مجردة.

abstract class Shape {
    protected $color;
    
    public function __construct($color) {
        $this->color = $color;
    }
    
    abstract public function calculateArea();
    
    public function getColor() {
        return $this->color;
    }
}

يجب على الفئات التابعة تنفيذ جميع الطرق المجردة (abstract methods):

class Rectangle extends Shape {
    private $width;
    private $height;
    
    public function __construct($color, $width, $height) {
        parent::__construct($color);
        $this->width = $width;
        $this->height = $height;
    }
    
    public function calculateArea() {
        return $this->width * $this->height;
    }
}

الخصائص الرئيسية:

  • لا يمكن إنشاء كائنات من الفئات المجردة مباشرة
  • الطرق المجردة ليس لها تنفيذ في الفئة المجردة
  • يجب على الفئات التابعة تنفيذ جميع الطرق المجردة
  • يمكن أن تحتوي الفئات المجردة على طرق مجردة وطرق عادية
  • يتم توريث الطرق العادية في الفئات المجردة من قبل الفئات التابعة

جرّب بنفسك

<?php
require_once 'Song.php';
require_once 'Podcast.php';

// قراءة المدخلات
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));

// TODO: إنشاء كائن Song باستخدام songTitle و artistName

// TODO: إنشاء كائن Podcast باستخدام podcastTitle و episodeNumber

// TODO: طباعة نتيجة استدعاء play() على الأغنية (song)

// TODO: طباعة نتيجة استدعاء play() على البودكاست (podcast)

?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming