X++ inheritance

توضح هذه المقالة التوريث في X++، بما في ذلك كيفية إنشاء فئة فرعية وتجاوز أسلوب.

إنشاء فئة فرعية

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

Subclass example

ينشئ المثال التالي أولا فئة تسمى Point. ثم يوسع فئة Point لإنشاء فئة جديدة تسمى ThreePoint.

class Point
{
    // Instance fields.
    real x; 
    real y; 

    // Constructor to initialize fields x and y.
    void new(real _x, real _y)
    { 
        x = _x;
        y = _y;
    }
}

class ThreePoint extends Point
{
    // Additional instance fields z. Fields x and y are inherited.
    real z; 

    // Constructor is overridden to initialize z.
    void new(real _x, real _y, real _z)
    {
        // Initialize the fields.
        super(_x, _y); 
        z = _z;
    }
}

منع توريث الفئة

يمكنك منع توريث الفئات باستخدام المعدل النهائي .

public final class Attribute
{
    int objectField;
}

تجاوز أسلوب

يتم توريث الأساليب في فئة بواسطة أي فئة توسع الفئة. لتغيير وظيفة أسلوب موروث، يمكنك إنشاء أسلوب في الفئة الفرعية، ثم إعطاء هذا الأسلوب نفس الاسم والمعلمات مثل الأسلوب في الفئة الفائقة. تعرف هذه العملية باسم تجاوز الأسلوب .

عند إنشاء مثيل للفئة الفرعية، يمكنك تعيين المرجع إما إلى متغير من نوع الفئة الفائقة أو نوع الفئة الفرعية. بغض النظر عن نوع المتغير، يتم استدعاء الأسلوب الذي تم تجاوزه.

في مثال التعليمات البرمجية التالي، تتجاوز الفئة الفرعية أسلوب الكتابة . يتم إنشاء متغيرين، كل من النوع نقطة . يتم تعيين عنصر نقطة واحد، والآخر يتم تعيين كائن ThreePoint . عند استدعاء أسلوب الكتابة على كائن ThreePoint ، يتم استدعاء إصدار ThreePoint من الأسلوب.

class Point
{
    // Instance fields.
    real x;
    real y;

    // Constructor to initialize fields x and y.
    void new(real _x, real _y)
    {
        x = _x;
        y = _y;
    }

    void write()
    {
        info("(" + any2Str(x) + ", " + any2Str(y) + ")");
    }
}

class ThreePoint extends Point
{
    // Additional instance fields z. Fields x and y are inherited.
    real z;

    // Constructor is overridden to initialize z.
    void new(real _x, real _y, real _z)
    {
        // Initialize the fields.
        super(_x, _y);
        z = _z;
    }

    void write()
    {
        info("(" + any2Str(x) + ", " + any2Str(y) + ", " + any2Str(z) + ")");
    }

}

// Code that creates Point objects and calls the write method.
Point point2 = new Point(1.0, 2.0);
Point point3 = new ThreePoint(3.0, 4.0, 5.0);

point2.write();
// Output is "(1.0, 2.0)".

point3.write();
// Output is "(3.0, 4.0, 5.0)".

منع تجاوزات الأسلوب

لا يمكنك تجاوز الأساليب الثابتة لأنها موجودة لكل فئة. لحماية الأساليب الحساسة الأخرى أو الأساليب الأساسية من التجاوز، استخدم المعدل النهائي . في المثال التالي، نظرا لأنه تم تعريف methodAttكنهائي، لا يمكنك تجاوزه في أي فئة تقوم بتوسيع السمة. لا تحدد أساليب جديدة أو إنهاءكنهائي.

يوضح المثال التالي كيفية استخدام الكلمة الأساسية النهائية .

public class Attribute
{
    int objectVariable;

    final void methodAtt()
    {
        //Some statements
    }
}

التجاوز مقابل التحميل الزائد

يحدث التجاوز عندما تقوم فئة فرعية بتغيير تنفيذ الفئة الفائقة لأسلوب، ولكن كلتا الطريقتين لها نفس التوقيع.

على النقيض من ذلك، يحدث التحميل الزائد عندما يكون لأكثر من أسلوب واحد نفس الاسم، ولكن الأساليب لها تواقيع مختلفة (أنواع الإرجاع أو قوائم المعلمات أو كليهما). يدعم X++ التجاوز، ولكنه لا يدعم التحميل الزائد.