02-10-12, 10:07 AM
كاتب الموضوع : 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 …
كود :
C3 = C1 AndAlso C2
طالما أنك بشكل عام لا يمكنك عمل إجراءين في فيجول بايزيك يختلفان فقط بالقيمة المعادة ولكن يمكن عمل ذلك فقط بالنسبة لمعاملات 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