تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
التحميل الزائد للمعاملات Operators Overloading
#1
كاتب الموضوع : samerselo


يعرف فيجول بايزيك معاملات للتعابير التي تستخدم الأنواع القياسية للبيانات مثل المنطقية أو الحقيقية. وهي تحدد بعض المعاملات الخاصة بالأغراض Objects مثل Is أو IsNot ولكن بعض المعاملات مثل * و Mod لا تعني شيئا بالنسبة لتلك الأغراض بشكل عام.

ومع ذلك يمكنك تعريف معاملات Operators بالنسبة للتراكيب Structures والفئات Classes بحيث تكون الصيغة العامة للمعامل Operator كما يلي

كود :
[ <attributes> ] Public [ Overloads ] Shared [ Shadows ] _
[ Widening | Narrowing ] Operator symbol ( operands ) As type
...
End Operator
وتكون أقسام هذه الصيغة العامة كما يلي:
• Attributes خصائص المعامل
• Public و Shared جميع المعاملات يجب تعريفها باستخدام محدد الوصول Public أو Shared
• Overloads نستخدمه عندما يكون لدينا معامل يأخذ بارامترين من فئة أساسية وفئة مشتقة وفي هذه الحالة يعني أنك تتجاوز المعامل الموجود في الفئة الأساسية
• Shadows المعامل يستبدل معامل مماثل موجود في الفئة الأساسية
• Widening يبين أن المعامل يحدد تحويل تعريض ينجح دوما في زمن التشغيل وبالتالي فهذا المعامل يجب عليه التقاط مؤشر لجميع الأخطاء الممكن حدوثها. والمعامل CType يجب أن يحتوي على أحد الكلمتين الأساسيتين Widening أو Narrowing
• Narrowing يبين أن المعامل يحدد تحويل تضييق ربما يفشل في زمن التشغيل. والمعامل CType يجب أن يحتوي على أحد الكلمتين الأساسيتين Widening أو Narrowing
• Symbol رمز المعامل ويجب أن يكون أحد القيم التالية: +, -, *, /, \, ^, &, <<, >>, =, <>, <, >, <=, >=, Mod, Not, And, Or, Xor, Like, IsTrue, IsFalse, CType
• Operands تعريف الأغراض التي تتم معالجتها من قبل المعامل بحيث تأخذ المعاملات +, -, Not, IsTrue, and IsFalse بارامتر واحد والمعاملات +, -, *, /, \, ^, &, <<, >>, =, <>, <, >, <=, >=, Mod, And, Or, Xor, Like, CType تأخذ بارامترين
• Type جميع المعاملات يجب أن يكون لها نوع بيانات معاد

والتحميل الزائد للمعاملات يكون محددا بعدة ضوابط
• بعض المعاملات تأتي على شكل أزواج وإن قمت بتعريف واحد منها يجب عليك تعريف الآخر وهي:
o = و <>
o < و >
o >= و <=
o IsTrue و IsFalse
• في المعاملات العادية والمنطقية يجب أن تظهر الفئة المعرفة للمعامل في المعامل. ومن أجل معاملات تحويل النوع يجب على الفئة أو التركيب الظهور في المعامل أو القيمة المعادة
• المعاملان IsTrue و IsFalse يجب أن يعيدا قيمة منطقية
• المعامل الثاني لـ << و >> يجب أن يكون عدد صحيح

إذا عرفت معاملا يستطيع فيجول بايزيك معالجة ذلك المعامل متبوعا بإشارة = بشكل تلقائي فإن عرفت المعامل + فإن فيجول بايزيك يفهم المعامل =+ تلقائيا
طالما أنه لا يمكنك استخدام المعاملين IsTrue و IsFalse بشكل مباشر فيمكنك استخدامهما بشكل غير مباشر فإن قمت بتعريف المعامل IsTrue لفئة ما يستخدمها فيجول بايزيك لتحديد فيما إذا كان استخدام ذلك الغرض كقيمة True في التعبير المنطقي. فعلى سبيل المثال تستخدم العبارة التالية لتحديد فيما إذا كان الغرض c1 يمكن اعتباره True

كود :
If c1 Then …
وإن عرفت المعاملان And و IsFalse فيقوم فيجول بايزيك باستخدامهما لمعالجة المعامل AndAlso أيضا ومن أجل أن يعمل هذا يجب على المعامل And إعادة نفس نوع الفئة أو التركيب الذي عرفته ضمنها. فإن افترضنا أنك عرفت And و IsFalse في الفئة Composite والمتغيرات C1 و C2 و C3 هي تواجدات Instances لتلك الفئة انظر العبارة

كود :
C3 = C1 AndAlso C2
فهنا يستخدم فيجول بايزيك المعامل IsFalse لتقييم C1 فإن أعاد المعامل IsFalse القيمة True فلن يزعج البرنامج نفسه بتقييم قيمة C2 ويفترض أن قيمة العبارة كاملة هي False ويعيد القيمة False بالنسبة للتعبير بكامله وذلك لأن IsFalse أعادت القيمة True بالنسبة لـ C1 ويعرف فيجول بايزيك تلقائيا أنه إذا كانت قيمة C1 هي False فيجعل قيمة C3 مساوية لقيمة C1 وهذا يسبب بعض التشويش ومما يجعل الأمر منطقيا أكثر هو التفكير بأن فيجول بايزيك يقيم التعابير المنطقية التي تستخدم المعامل AndAlso العادي. وبشكل مشابه يمكن تعريف المعاملين Or و IsTrue فيقوم فيجول بايزيك تلقائيا بتزويدنا بالمعامل OrElse

طالما أنك بشكل عام لا يمكنك عمل إجراءين في فيجول بايزيك يختلفان فقط بالقيمة المعادة ولكن يمكن عمل ذلك فقط بالنسبة لمعاملات CType الخاصة بالتحويل بين الأنواع فعندما يحاول البرنامج التحويل بين الأنواع يمكنه تحديد أي معامل يجب عليه استخدامه بمعرفته لنوع القيمة المعادة

وفي الكود التالي نرى الفئة Complex التي تمثل ر قم معقد وتحدد المعاملات + و – و * لتعريف عمليات الجمع والطرح والضرب للأرقام المعقدة ويحدد أيضا المعاملات = و <> ومعاملات التحويل التي تحول الرقم المعقد لقيمة معادة من النوع Double لإعطائها أهميتها

كود :
Public Class Complex
Public Re As Double
Public Im As Double

' Constructors.
Public Sub New()

End Sub

Public Sub New(ByVal real_part As Double, ByVal imaginary_part As Double)
Re = real_part
Im = imaginary_part
End Sub

' ToString.
Public Overrides Function ToString() As String
Return Re.ToString & " + " & Im.ToString & "i"
End Function

' Operators.
Public Shared Operator *(ByVal c1 As Complex, ByVal c2 As Complex) As Complex
Return New Complex( _
c1.Re * c2.Re - c1.Im * c2.Im, _
c1.Re * c2.Im + c1.Im * c2.Re)
End Operator

Public Shared Operator +(ByVal c1 As Complex, ByVal c2 As Complex) As Complex
Return New Complex( _
c1.Re + c2.Re, _
c1.Im + c2.Im)
End Operator

Public Shared Operator -(ByVal c1 As Complex, ByVal c2 As Complex) As Complex
Return New Complex(c1.Re - c2.Re, c1.Im - c2.Im)
End Operator

Public Shared Operator =(ByVal c1 As Complex, ByVal c2 As Complex) As Boolean
Return (c1.Re = c2.Re) AndAlso (c1.Im = c2.Im)
End Operator

Public Shared Operator <>(ByVal c1 As Complex, ByVal c2 As Complex) As Boolean
Return (c1.Re <> c2.Re) OrElse (c1.Im <> c2.Im)
End Operator

Public Shared Operator -(ByVal c1 As Complex) As Complex
Return New Complex(c1.Im, c1.Re)
End Operator

Public Shared Narrowing Operator CType(ByVal c1 As Complex) As Double
Return System.Math.Sqrt(c1.Re * c1.Re + c1.Im * c1.Im)
End Operator

End Class
}}}}
تم الشكر بواسطة:


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


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