-
كيفية استخدام مجموعة C# والحصول عليها
تحتوي لغة C# على وظيفتين - وظيفة التعيين (get) ووظيفة القيمة (set)، والتي يمكن رؤيتها بوضوح من خلال رمز اللغة الوسيطة الذي تنشئه. لا تؤيد لغة C# تحديد مستوى حماية المجال للعامة والسماح للمستخدمين بالعمل بشكل تعسفي خارج الفصل - وهذا أمر غير مقبول للغاية، أو لنكون أكثر تحديدًا، وغير آمن للغاية! بالنسبة لجميع الحقول التي يجب أن تكون مرئية خارج الفصل الدراسي، توصي لغة C# باستخدام السمات للتعبير عنها. السمات لا تمثل مواقع التخزين، وهو الفرق الأساسي بين السمات والمجالات. فيما يلي تصميم سمة نموذجي:
باستخدام النظام؛
classMyClass
{
عدد صحيح؛
عدد صحيح عام
{
الحصول على {إرجاع عدد صحيح؛}
مجموعة {عدد صحيح = القيمة؛}
}
}
اختبار الطبقة
{
الفراغ العام الثابت الرئيسي ()
{
MyClass MyObject=new MyClass();
Console.Write(MyObject.Integer);
MyObject.Integer++;
Console.Write(MyObject.Integer);
}
}
كما هو متوقع، مخرجات البرنامج 0 1. يمكننا أن نرى أن السمات توفر للمبرمجين واجهة وصول سهلة لأعضاء المجال عن طريق طرق الالتفاف. القيمة هنا هي الكلمة الأساسية لـ C#، وهي المعلمة الضمنية للمجموعة عند إجراء عمليات السمة، أي قيمة r عند إجراء عمليات كتابة السمة.
توفر السمات ثلاث عمليات واجهة: للقراءة فقط (الحصول على)، والكتابة فقط (مجموعة)، والقراءة والكتابة (الحصول على وتعيين). يجب الإعلان عن هذه العمليات الثلاث في المجال تحت نفس اسم السمة ولا يمكن فصلها، راجع التنفيذ التالي:
classMyClass
{
اسم السلسلة الخاصة؛
اسم السلسلة العامة
{
الحصول على { اسم الإرجاع }
}
اسم السلسلة العامة
{
تعيين { الاسم = القيمة }
}
}
الطريقة المذكورة أعلاه لفصل تنفيذ سمة الاسم خاطئة! يجب أن نجمعها معًا كما في المثال السابق. ومن الجدير بالذكر أن الخصائص الثلاث (للقراءة فقط، للقراءة والكتابة فقط، للقراءة والكتابة) تعتبر هي نفس اسم الخاصية في لغة C#، راجع المثال التالي:
classMyClass
{
الرقم الصحيح المحمي = 0 ؛
رقم كثافة العمليات العامة
{
تعيين
{
الأسطوانات = القيمة؛
}
}
}
فئة MyClassDerived: MyClass
{
رقم كثافة العمليات العام الجديد
{
يحصل
{
رقم الإرجاع؛
}
}
}
اختبار الطبقة
{
الفراغ العام الثابت الرئيسي ()
{
MyClassDerived MyObject = new MyClassDerived();
//MyObject.Num= 1; //خطأ!
((MyClass)MyObject).Num = 1;
}
}
يمكننا أن نرى أن السمة Num-get{} في MyClassDerived تمنع تعريف السمة Num-set{} في MyClass.
بالطبع، السمات هي أكثر بكثير من مجرد عمليات واجهة المجال، حيث لا يزال جوهر السمات عبارة عن طرق، حيث يمكننا إجراء عمليات فحص وتحذيرات معينة وعمليات إضافية أخرى بناءً على منطق البرنامج عند استخراج السمات أو تعيينها.
classMyClass
{
اسم السلسلة الخاصة؛
اسم السلسلة العامة
{
الحصول على { اسم الإرجاع }
تعيين
{
إذا (القيمة == فارغة)
اسم = "مايكروسوفت"؛
آخر
الاسم = القيمة؛
}
}
}
نظرًا لطبيعة طريقة السمات، فإن السمات بالطبع لها أيضًا تعديلات مختلفة على الطرق. تحتوي السمات أيضًا على 5 معدّلات وصول، لكن معدّلات الوصول للسمات غالبًا ما تكون عامة، وإلا فسنفقد معنى السمات كواجهات عامة للفئات. بالإضافة إلى عدم وجود سمات الميزة مثل التحميل الزائد للطريقة الناتج عن معلمات متعددة للطريقة، فإن المعدلات مثل الافتراضية والمختومة والتجاوز والملخص لها نفس السلوك بالنسبة للسمات والأساليب، لأن السمات يتم تنفيذها بشكل أساسي كطريقتين إن بعض السلوكيات تتطلب اهتمامنا. انظر إلى المثال التالي:
فئة مجردة أ
{
كثافة العمليات ذ؛
int الظاهري العام X
{
الحصول على { العودة 0 }
}
الظاهري العام Y
{
الحصول على { العودة ص }
مجموعة {ص = القيمة}
}
الملخص العام int Z { get }
}
الفئة ب: أ
{
كثافة العمليات ض؛
التجاوز العام int X
{
الحصول على { قاعدة العودة.X + 1 }
}
التجاوز العام int Y
{
مجموعة {base.Y = القيمة <0؟ 0: القيمة}
}
التجاوز العام int Z
{
الحصول على { العودة ض }
مجموعة { ض = القيمة }
}
}
يسلط هذا المثال الضوء على بعض السلوك النموذجي للخصائص في سياق الميراث. هنا، يجب إعلان الفئة A مجردة بسبب وجود السمة المجردة Z. تشير الفئة الفرعية B إلى سمات الفئة الأصلية A من خلال الكلمة الأساسية الأساسية. يمكن للفئة B استبدال السمات الافتراضية في الفئة A فقط من خلال مجموعة Y.
يمكن للخصائص الثابتة، مثل الأساليب الثابتة، الوصول إلى متغيرات المجال الثابتة للفئة فقط. يمكننا أيضًا الإعلان عن الخصائص الخارجية تمامًا كما نفعل مع الطرق الخارجية.