تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الطرائق المُوَسِّعة Extension Methods من جديد VB2008
#1
كاتب الموضوع : samerselo

يقدم فيجول بايزيك 2008 الطرائق المُوَسِّعة Extension Methods التي تمكن المطور من إضافة وظائف مخصصة لأنواع البيانات المعرفة سابقا من دون إنشاء نوع جديد مشتق. مما يمكنك من كتابة طريقة يمكن أن تستدعى كما لو كانت من ضمن النوع الموجود. والطريقة الموسعة يمكن أن تكون إجراء Sub أو وظيفة Function ولا يمكن أن تكون خاصية Property أو حقل Field أو حدث Event وجميع الطرائق الموسعة يجب تعليمها بالصفة <Extension()> من مجال الأسماء System.Runtime.CompilerServices وتحدد الوسيطة الأولى في الطرائق الموسعة نوع البيانات المراد الذي سيطلق الطريقة.
في المثال التالي يتم تحديد الطريقة Print لتوسيع نوع البيانات string والتي تستخدم Console.WriteLine لإظهار النص حيث يؤسس الوسيط aString أن الطريقة Print توسع الفئة String

كود :
Imports System.Runtime.CompilerServices

Module StringExtensions

<Extension()> _
Public Sub Print(ByVal aString As String)
Console.WriteLine(aString)
End Sub

End Module
لاحظ أن تعريف الطريقة الموسعة محدد بالصفة <Extension()> ويكون تعليم الـ Module الحاوية للطريقة اختياري ولكن كل طريقة موسعة يجب أن يتم تعليمها بالصفة المذكورة كما يجب استيراد مجال الأسماء System.Runtime.CompilerServices حتى نتمكن من الوصول إلى تلك الصفة. ولا يمكن تعريف الطرائق الموسعة إلا ضمن module ونموذجيا تعرف الطريقة الموسعة في نفس الـ Module التي ستستدعيها وبدلا عن ذلك يتم استيرادها في المكان الذي سنحتاج لاستخدامها فيه فبعد الـ Module التي تحتوي على الطريقة Print يمكن استدعاء الطريقة عندما يكون هناك طريقة لا تأخذ وسائط مثل ToUpper

كود :
Imports ConsoleApplication2.StringExtensions

Module Module1

Sub Main()

Dim example As String = "Hello"
' Call to extension method Print.
example.Print()

' Call to instance method ToUpper.
example.ToUpper()
example.ToUpper.Print()

End Sub

End Module
وفي المثال التالي تكون PrintAndPunctuate طريقة موسعة أخرى للنوع String وفي هذه المرة تمتلك وسيطتين الأولى aString تحدد أن الطريقة توسع النوع String وتكون الوسيطة الثانية punc عبارة عن سلسلة من علامات الترقيم التي ستمرر عند استدعاء الطريقة التي تظهر نصا متبوعا بعلامات الترقيم

كود :
<Extension()> _
Public Sub PrintAndPunctuate(ByVal aString As String, _
ByVal punc As String)
Console.WriteLine(aString & punc)
End Sub
حيث يتم استدعاء الطريقة بتمرير وسيطة نصية لـ punc مثلا example.PrintAndPunctuate(".")
ويظهر المثال التالي تحديد واستدعاء Print و PrintAndPunctuate واستيراد System.Runtime.CompilerServices الذي يمكن من الوصول إلى الصفة التي تحدد الطرائق الموسعة

كود :
Imports System.Runtime.CompilerServices

Module StringExtensions

<Extension()> _
Public Sub Print(ByVal aString As String)
Console.WriteLine(aString)
End Sub

<Extension()> _
Public Sub PrintAndPunctuate(ByVal aString As String, _
ByVal punc As String)
Console.WriteLine(aString & punc)
End Sub

End Module
ثم يتم استدعاء الطرائق الموسعة

كود :
Imports ConsoleApplication2.StringExtensions
Module Module1

Sub Main()

Dim example As String = "Example string"
example.Print()

example = "Hello"
example.PrintAndPunctuate(".")
example.PrintAndPunctuate("!!!!")

End Sub
End Module
الرد }}}
تم الشكر بواسطة:
#2
كل ما يتطلبه تشغيل طرائق موسعة كهذه هي أن تكون ضمن مجال رؤية الكود فإن كانت Module ضمن المجال فستكون الطريقة مرئية من قبل IntelliSense ويمكن استدعاؤها كما لو كانت من ضمن الطرائق الاعتيادية.
لاحظ انه عندما يتم استدعاء الطرائق الموسعة لا يتم تمرير قيم للوسيطة الأولى فالوسيطة aString في الطريقة السابقة تحدد أنها يجب أن تستدعى من النوع string والمترجم سيستخدم المتغير النصي كقيمة لتلك الوسيطة
ويمكن تحديد طرائق موسعة على معظم الأنواع التي يمكن استخدامها في فيجول بايزيك ضمن قائمة الوسائط متضمنا التالي:
• الفئات (الأنواع المرجعية) Classes (Reference Types)
• التراكيب Structures
• الواجهات Interfaces
• الإجراءات المفوضة Delegates
• وسائط ByRef و ByVal
• وسائط الأنواع Generic
• المصفوفات Arrays
توفر الطرق الموسعة طريقة مريحة وقوية لتوسيع نوع موجود ومع ذلك كي يمكن استخدامهم بنجاح هناك بعض النقاط التي يجب أخذها بعين الاعتبار وهي تنطبق بشكل رئيس على مطوري مكتبات الفئات Class Libraries ولكنها يمكن أن تؤثر على أي تطبيق يستخدم الطرائق الموسعة. وبشكل عام فالطرائق الموسعة التي تضيفها للأنواع التي لا تملكها تكون أضعف من تلك التي تملك التحكم عليها لوجود عدد من الأشياء التي قد تحدث عندما تضاف طرائق موسعة للأنواع التي لا تملكها فيمكن أن تتداخل تلك الطرائق مع عمل طريقتك الموسعة
• عند وجود عنصر عضو في الفئة يملك توقيعا متوافقا مع وسائط التعبير المستدعي بدون حدوث تحويل تضييق narrowing Conversion مطلوب من الوسائط فيملك ذلك العنصر الأفضلية على طريقتك الموسعة لذلك يمكن عند إضافة بعض الخصائص للفئة أن لا يعود بالإمكان الوصول لطريقتك الموسعة
• لا يمكن أن يمنع كاتب الطريقة الموسعة المبرمجين الآخرين من كتابة طرائق موسعة تتعارض مع طريقته
• يمكنك تحسين قوة إجراءاتك الموسعة بوضعها ضمن مجال أسماء namespace خاص بهم لتمكين مستخدمي مكتبتك من استيراد أو استبعاد كامل مجال الأسماء أو اختيار المناسب من مجالات أسماء المكتبة
• يكون توسيع الواجهات Interfaces آمن من توسيع الفئات Classes وخاصة إذا كنت لا تملك تلك الواجهة أو الفئة فكل تغيير في واجهة سيؤثر على جميع الفئات التي تعتمد عليها لذلك فالمبرمج قليلا ما يغير في الطرائق الموجودة في الواجهة
• قم بتوسيع نوعا محددا قدر الإمكان فعندما توسع نوعا تشتق منه أنواع أخرى تكون هناك طبقات من الاحتمالات من الطرائق العادية والموسعة التي قد تتداخل مع طريقتك
عندما يتطابق توقيع طريقة عادية Instance Method مع طريقة موسعة Extension Method في نفس المجال لا يمكن الوصول للطريقة الموسعة بالنتيجة. لهذا لا يمكن أن نقوم باستخدام طريقة موسعة لاستبدال طريقة عادية ومع ذلك يمكن للطرائق الموسعة امتلاك نفس الاسم مع الطرائق العادية ولكن مع توقيع مختلف فتكون كلتا الطريقتان متوفرتان طالما أن التوقيع مختلف فمثلا إن كانت الفئة ExampleClass تحتوي على طريقة exampleMethod لا تأخذ أية وسائط يمكن لطريقة موسعة تمتلك نفس الاسم أن تتواجد ولكن بتوقيع مختلف

كود :
Imports ConsoleApplication2.ExtensionExample
Module Module1

Sub Main()
Dim ex As New ExampleClass
' The following statement calls the extension method.
ex.exampleMethod("Extension method")
' The following statement calls the instance method.
ex.exampleMethod()
End Sub

Class ExampleClass
' Define an instance method named exampleMethod.
Public Sub exampleMethod()
Console.WriteLine("Instance method")
End Sub
End Class

End Module
Imports System.Runtime.CompilerServices

' Define an extension method named exampleMethod.
Module ExtensionExample
<Extension()> _
Sub exampleMethod(ByVal ec As ExampleClass, _
ByVal stringParameter As String)
Console.WriteLine(stringParameter)
End Sub

End Module
والخرج الناتج عن الكود السابق يكون كما يلي
Extension method
Instance method
عندما يكون لطريقتين موسعتين توقيعان مطابقان في نفس مجال الوصول يتم استدعاء الطريقة التي تملك الأسبقية العليا حيث يتم تحديد هذه الأسبقية عبر طريقة إدخال هذه الطريقة ضمن المجال وتمثل القائمة التالية تسلسل الأسبقية التالي:
1. الطرائق الموسعة الموجودة سابقا ضمن نفس الـ Module
2. الطرائق الموسعة المعرفة ضمن أنواع البيانات في مجال الأسماء الحالي أو أحد آبائه حيث تملك مجالات الأسماء الأبناء أسبقية على الآباء
3. الطرائق الموسعة المعرفة ضمن أي نوع تم استيراده للملف الحالي
4. الطرائق الموسعة الموجودة ضمن أي مجال أسماء مستورد ضمن الملف الحالي
5. الطرائق الموسعة المعرفة ضمن أي نوع مستورد على مستوى المشروع
6. الطرائق الموسعة المعرفة ضمن أي مجال أسماء مستورد على مستوى المشروع
فإن لم تحل تلك الأسبقية المشكلة يمكنك عندها استخدام الاسم الكامل للطريقة الموسعة لتحديد الطريقة التي تقوم باستدعائها فإن كانت الطريقة Print في المثال السابق محددة ضمن الـ Module المسماة StringExtensions يكون الاسم الكامل للطريقة الموسعة هو StringExtensions.Print(example) بدلا عن example.Print().
الرد }}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  Private Text Encryption -خدمة للمبرمجين في جديد عالم التشفير- RaggiTech 1 3,547 07-05-20, 05:48 AM
آخر رد: سعود
Lightbulb [VB.NET] تايمر جديد اسرع بأضعاف من التايمر العادي ؟! 3booody 9 5,319 27-11-19, 11:33 PM
آخر رد: 3booody
Rainbow [VB.NET] كلاس ResizeControls وطريقة جديد ومميزة لتكبير وتصغير ادوات الفورم تلقائيا الماجيك مسعد 8 8,761 01-10-18, 03:03 AM
آخر رد: LEO
  Nullable Value Types في VB2008 oneyemenweb2 0 1,789 06-10-12, 11:37 PM
آخر رد: oneyemenweb2
  كونترول جديد من مايكروسوفت MsChart Control RaggiTech 1 3,131 05-10-12, 03:04 PM
آخر رد: RaggiTech
  نوع بيانات جديد (تاريخ) RaggiTech 0 1,977 05-10-12, 03:34 AM
آخر رد: RaggiTech
  جديد 2010- اكتب الكود الذي سيستخدم فئتك ثم قم بإنشائها RaggiTech 0 2,255 03-10-12, 12:27 PM
آخر رد: RaggiTech
  الاستدلال المحلي على النوع Local Type Inference من جديد VB2008 RaggiTech 0 2,028 02-10-12, 09:43 AM
آخر رد: RaggiTech
  الأنواع المجهولة Anonymous Types، من جديد VB 2008 RaggiTech 0 1,863 02-10-12, 08:57 AM
آخر رد: RaggiTech
  أفضل طريقة لإنشاء كائن جديد - شارك في النقاش RaggiTech 1 1,939 01-10-12, 11:07 PM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم