أساسيات التوريث

العبارة Inherits تستخدم لتعريف فئة جديدة تسمى الفئة المشتقة، مستنده على فئة موجودة تعرف بالفئة الأساسية. الفئات المشتقة ترث كما يمكنها توسيع الخصائص، الأساليب، الأحداث, الحقول و الثوابت المعرّفة في الفئة الأساسية. يصف القسم التالي بعض قواعد التوريث، و المعدّلات التي يمكنك أن تستخدمها لتغيير الطريقة التي ترث و تورث بها الفئات:

  • بشكل افتراضي, تكون كل الفئات قابلة للتوريث إلا إذا تم وضع الكلمة الأساسية NotInheritable. يمكن أن ترث الفئات من فئات أخرى في المشروع الخاص بك أو من فئات في تجميعات أخرى يشير إليها مشروعك.

  • بعكس اللغات التي تسمح بالتوريث المتعدد Visual Basic تسمح بتوريث واحد فقط في الفئات; أي أن الفئات المشتقة يمكن أن يكون لديها فئة أساسية واحدة فقط. على الرغم من أن التوريث المتعدد غير مسموح به في الفئات، يمكن أن تطبق الفئات واجهات متعددة، الذي يحقق نفس النتيجة بشكل فعال.

  • لمنع الكشف عن عناصر مقيدة موجودة في فئة أساسية, يجب أن يكون نوع الوصول للفئة المشتقة يساوي أو أكثر تقييداً من الفئة الأساسية الخاصة به. على سبيل المثال، الفئة Public لا ترث Friend أو فئة Private, و فئة Friend لا ترث فئة Private.

معدلات التوريث

يقدم Visual Basic عبارات و معدّلات مستوى الفئة التالية لدعم الوراثة:

  • عبارة Inherits — تحدد الفئة الأساسية.

  • معدّل NotInheritable— يمنع المبرمجين من استخدام الفئة كفئة أساسية.

  • معدّل MustInherit — يحدد أن الفئة مخصص للاستخدام كفئة أساسية فقط. مثيلات فئات MustInherit لا يمكن إنشائها مباشرة; يمكن إنشائها كمثيلات فئة أساسية لفئة مشتقة فقط. (لغات البرمجة الأخرى، مثل ++C و #C، تستخدم المصطلح فئة مجردة لتصف مثل هذه الفئة.)

تجاوز خصائص و أساليب في الفئات المشتقة

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

  • Overridable — يسمح لخاصية أو أسلوب في فئة ليتم تجاوزه في الفئة المشتقة.

  • Overrides — يتجاوز خاصية أو أسلوب Overridable المعرفة في الفئة الأساسية.

  • NotOverridable — يمنع خاصية أو أسلوب من أن يتم تجاوزه في الفئة التي ترث. بشكل افتراضي، أساليب Public هي NotOverridable.

  • MustOverride — يتطلب أن يتم تتجاوز الفئة المشتقة الخاصية أو الأسلوب. عندما يتم استخدام الكلمة الأساسية MustOverride، تعريف الأسلوب يتكون من عبارة Sub, Function، أو Property. لا يتم السماح لأي عبارات أخرى، وتحديداً لا توجد عبارة End Sub أو End Function. أساليب MustOverride يجب تعريفها في فئات MustInherit.

بفرض أنك تريد تعريف فئات لتتعامل مع payroll. يمكنك تعريف فئة Payroll عامة التي تحتوي على أسلوب RunPayroll الذي يحسب الرواتب لأسبوع نموذجي. يمكنك بعد ذلك استخدام Payroll كفئة أساسية لفئة BonusPayroll أكثر اختصاص، التي يمكن استخدامها عند توزيع مكافئات الموظف.

الفئة BonusPayroll يمكن ترث و تتجاوز ، الأسلوب PayEmployee المعرف في الفئة الأساسية Payroll.

يعرف المثال التالي الفئة الأساسية Payroll, و الفئة المشتقة BonusPayroll، التي تتجاوز الأسلوب الموروث PayEmployee. إجراء RunPayroll، ينشئ و من ثم يقوم بتمرير كائن Payroll و كائن BonusPayroll إلى دالة، Pay، التي تنفذ الأسلوب PayEmployee لكلا الكائنات.

Const BonusRate As Decimal = 1.45D
Const PayRate As Decimal = 14.75D

Class Payroll
    Overridable Function PayEmployee( 
        ByVal HoursWorked As Decimal, 
        ByVal PayRate As Decimal) As Decimal

        PayEmployee = HoursWorked * PayRate
    End Function
End Class

Class BonusPayroll
    Inherits Payroll
    Overrides Function PayEmployee( 
        ByVal HoursWorked As Decimal, 
        ByVal PayRate As Decimal) As Decimal

        ' The following code calls the original method in the base 
        ' class, and then modifies the returned value.
        PayEmployee = MyBase.PayEmployee(HoursWorked, PayRate) * BonusRate
    End Function
End Class

Sub RunPayroll()
    Dim PayrollItem As Payroll = New Payroll
    Dim BonusPayrollItem As New BonusPayroll
    Dim HoursWorked As Decimal = 40

    MsgBox("Normal pay is: " & 
        PayrollItem.PayEmployee(HoursWorked, PayRate))
    MsgBox("Pay with bonus is: " & 
        BonusPayrollItem.PayEmployee(HoursWorked, PayRate))
End Sub

الكلمة الأساسية MyBase

الكلمة الأساسية MyBase تتصرف كمتغير كائن يشير إلى الفئة الأساسية للمثيل الحالي لفئة. MyBase يستخدم بشكل متكرر للوصول إلى أعضاء الفئة الأساسية التي تم تجاوزها أو تظليلها في فئة مشتقة. تحديداً، MyBase.New يُستخدم لاستدعاء منشئ الفئة الأساسية بشكل صريح من منشئ الفئة المشتقة.

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

Class DerivedClass
    Inherits BaseClass
    Public Overrides Function CalculateShipping( 
        ByVal Dist As Double, 
        ByVal Rate As Double) As Double

        ' Call the method in the base class and modify the return value.
        Return MyBase.CalculateShipping(Dist, Rate) * 2
    End Function
End Class

تصف القائمة التالية قيود على استخدام MyBase:

  • MyBase يشير إلى الفئة الأساسية الفورية وأعضاؤها الموروثة. لا يمكن استخدامه للوصول إلى أعضاء Private في الفئة.

  • MyBase هي كلمة أساسية وليس كائن حقيقي. MyBase لايمكن تعيينه لمتغير، تمريره إلى إجراءات أو استخدامه في مقارنة Is.

  • الأسلوب الذي يأهله MyBase ليس من الضروري أن يتم تعريفه في الفئة الأساسية الفورية; بدلاً من ذلك يمكن تعريفه بشكل غير مباشر في فئة أساسية موروثة. من أجل تحويل برمجي صحيح لمرجع مؤهل بواسطة MyBase، يجب أن تحتوي بعض الفئات الأساسية أسلوب مطابق لاسم وأنواع المعلمات التي تظهر في الاستدعاء.

  • لا يمكنك استخدام MyBase لاستدعاء أساليب الفئة الأساسية MustOverride.

  • MyBase لا يمكن استخدامه لتأهيل نفسه. ولذلك، التعليمات البرمجية التالية غير صالحة:

    MyBase.MyBase.BtnOK_Click()

  • MyBase لا يمكن استخدامه في الوحدات النمطية.

  • MyBase لا يمكن استخدامه للوصول لأعضاء الفئة الأساسية التي تم وضع علامة عليها كـ Friend إذا كانت الفئة الأساسية في تجميع مختلف.

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

الكلمة الأساسية MyClass

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

  • MyClass هي كلمة أساسية وليس كائن حقيقي. MyClass لايمكن تعيينه لمتغير، تمريره إلى إجراءات أو استخدامه في مقارنة Is.

  • MyClass يشير إلى الفئة الحاوية وأعضاؤها الموروثة.

  • MyClass يمكن استخدامه كمؤهل لأعضاء Shared.

  • MyClass لا يمكن استخدامه داخل أسلوب Shared, ولكن يمكن استخدامه داخل أسلوب مثيل للوصول إلى عضو مشترك لفئة.

  • MyClass لا يمكن استخدامه في الوحدات النمطية القياسية.

  • MyClass يمكن استخدامه لتأهيل أسلوب معرف في فئة أساسية و ليس له تطبيق للأسلوب الموفر في تلك الفئة. مثل هذا المرجع له نفس معنى أسلوبMyBase..

يقارن المثال التالي Me و MyClass.

Class baseClass
    Public Overridable Sub testMethod()
        MsgBox("Base class string")
    End Sub
    Public Sub useMe()
        ' The following call uses the calling class's method, even if 
        ' that method is an override.
        Me.testMethod()
    End Sub
    Public Sub useMyClass()
        ' The following call uses this instance's method and not any
        ' override.
        MyClass.testMethod()
    End Sub
End Class
Class derivedClass : Inherits baseClass
    Public Overrides Sub testMethod()
        MsgBox("Derived class string")
    End Sub
End Class
Class testClasses
    Sub startHere()
        Dim testObj As derivedClass = New derivedClass()
        ' The following call displays "Derived class string".
        testObj.useMe()
        ' The following call displays "Base class string".
        testObj.useMyClass()
    End Sub
End Class

بالرغم من أن derivedClass يتجاوز testMethod، الكلمة الأساسية MyClass في useMyClass تبطل تأثيرات التجاوز، و يقوم برنامج التحويل البرمجي بحل الاستدعاء إلى إصدار الفئة الأساسية لـtestMethod.

راجع أيضًا:

المرجع

يرث الكشف

المبادئ

Me, My, MyBase, and MyClass في Visual Basic