Out (معدّل عام) في (Visual Basic)

تطبيقا على معلمات الأنواع العامة، الكلمة الأساسية Out تجعل النوع covariant.

ملاحظات

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

لمزيد من المعلومات، راجع التباين المشترك و Contravariance في (C#و Visual Basic).

القواعد

يمكنك استخدام الكلمة الأساسية Out في الواجهات العامة و المفوضين.

في الواجهة العامة يمكن تعريف معلمة النوع covariant إذا كانت تحقق الشروط التالية:

  • تستخدم معلمة النوع فقط كنوع إرجاع لأساليب الواجهة ولا تستخدم كنوع لوسيطات أسلوب.

    ملاحظة

    وجود استثناء واحد هو إلى هذه قاعدة. إذا كان لديك تفويض عام contravariant في واجهة covariant كمعلمة أسلوب يمكنك استخدام نوع الـ covariant كمعلمة نوع عام لهذا التفويض. للحصول على معلومات أكثر حول تفويضات covariant العامة وتفويضات contravariant العامة، راجع الفرق في المفوضون (C# و Visual Basic) و استخدام الفرق Func و إجراء التفويضات العام (C# و Visual Basic).

  • لا يتم استخدام معلمة النوع كقيد عام لأساليب الواجهة.

في التفويض العام، يمكن تعريف نوع المعلمة كـ covariant إذا كان يُستخدم فقط كنوع إرجاع للأسلوب ولا يُستخدم لوسيطات الأسلوب.

التباين المشترك والتباين المضاد مدعومان لأنواع المرجع وسكن ليس مدعومان لأنواع القيمة.

في Visual Basic يتعذر تعريف الأحداث في الواجهات covariant بدون تعيين نوع التفويض. أيضاً، لا يمكن أن تتداخل واجهات covariant فئات أو تتضمن التعدادات بنيات إلا أنه يمكن أن تتداخل الواجهات.

السلوك

تمكن الواجهة الذي تحتوي على معلمة نوع covariant أساليبها إلى إرجاع أنواع مشتقة أكثر من تلك المحددة بواسطة معلمة النوع. على سبيل المثال، (لأنه في .NET Framework 4) في IEnumerable<T>، النوع T عبارة عن covariant، يمكنك تعيين أي كائن من نوع IEnumerabe(Of String) إلى كائن من نوع IEnumerable(Of Object) دون استخدام أية أساليب تحويل خاصة.

يمكن تعيين تفويض covariant لتفويض آخر من نفس النوع، ولكن مع معلمة نوع عامة أكثر اشتقاقاً.

مثال

ويبين المثال التالي كيفية إعلان وتوسيع وتنفيذ واجهة covariant عامة. كما يوضح كيفية استخدام التحويل الضمني للفئات التي تقوم بتطبيق واجهة covariant.

' Covariant interface.
Interface ICovariant(Of Out R)
End Interface

' Extending covariant interface.
Interface IExtCovariant(Of Out R)
    Inherits ICovariant(Of R)
End Interface

' Implementing covariant interface.
Class Sample(Of R)
    Implements ICovariant(Of R)
End Class

Sub Main()
    Dim iobj As ICovariant(Of Object) = New Sample(Of Object)()
    Dim istr As ICovariant(Of String) = New Sample(Of String)()

    ' You can assign istr to iobj because
    ' the ICovariant interface is covariant.
    iobj = istr
End Sub

ويبين المثال التالي كيفية إنشاء مثيل وتعريف واستدعاء تفويض covariant عام. ويُظهر أيضاً كيفية استخدام التحويل الضمني لأنواع المفوض.

' Covariant delegate.
Public Delegate Function DCovariant(Of Out R)() As R

' Methods that match the delegate signature.
Public Shared Function SampleControl() As Control
    Return New Control()
End Function

Public Shared Function SampleButton() As Button
    Return New Button()
End Function

Private Sub Test()

    ' Instantiating the delegates with the methods.
    Dim dControl As DCovariant(Of Control) =
        AddressOf SampleControl
    Dim dButton As DCovariant(Of Button) =
        AddressOf SampleButton

    ' You can assign dButton to dControl
    ' because the DCovariant delegate is covariant.
    dControl = dButton

    ' Invoke the delegate.
    dControl()
End Sub

راجع أيضًا:

المرجع

في (معدّل عام) في (Visual Basic)

المبادئ

الالفرق في الواجهات العامة (C# و Visual Basic)