المسارات
/
C#
C#
/
التمارين
/
مونتشستر يونايتد الآمن
مونتشستر يونايتد الآمن

مونتشستر يونايتد الآمن

تمرين تعلّمي

مقدمة

التحويل

التحويل وتحويل الأنواع أسلوبان مختلفان لتغيير تعبير من نوع بيانات إلى آخر.

يمكن تحويل تعبير إلى نوع آخر باستخدام عامل التحويل (<type>).

long l = 1000L;
int i = (int)l;

object o = new Random();
Random r = (Random)o;

إذا لم يكن النوعان متوافقين، فيُطرح استثناء من النوع InvalidCastException. وفي حالة الأعداد، يشير هذا إلى أن النوع المستقبل لا يستطيع تمثيل القيمة المحوَّلة. أما في حالة الأصناف، فيجب أن يكون أحد النوعين مشتقًّا من الآخر (وهذا ينطبق أيضًا على البُنى بشكل بديهي).

وثمة بديل عن التحويل هو تحويل الأنواع باستخدام العامل is. ويُطبَّق هذا عادةً على أنواع المراجع والأنواع القابلة لأن تكون فارغة.

object o = new Random();
if (o is Random rand)
{
    int ii = rand.Next();
    // now, do something random
}

إذا احتجت إلى التعرّف على النوع الدقيق لكائن، فقد يكون العامل is متسامحًا أكثر مما ينبغي، لأنه سيُرجع صحيحًا بالنسبة إلى صنف وأي من الأصناف والواجهات التي اشتُقّ منها مباشرةً أو بشكل غير مباشر. وفي هذه الحالة يكون الحل هو typeof وObject.GetType().

object o = new List<int>();

o is ICollection<int> // true
o.GetType() == typeof(ICollection<int>) // false
o is List<int> // true
o.GetType() == typeof(List<int>) // true

التعليمات

نادي كرة القدم لدينا football-match-reports يتألق في الدوريات، وقد دُعيتَ للقيام بمزيد من العمل، هذه المرة على نظام طباعة التصاريح الأمنية.

التسلسل الهرمي لأصناف الطاقم الخلفي كما يلي

TeamSupport (interface)
├ Chairman
├ Manager
└ Staff (abstract)
    ├ Physio
    ├ OffensiveCoach
    ├ GoalKeepingCoach
    └ Security
        ├ SecurityJunior
        ├ SecurityIntern
        └ PoliceLiaison

يُقدَّم تنفيذ كامل لهذا التسلسل الهرمي كجزء من الكود المصدري للتمرين.

جميع البيانات التي تُمرَّر إلى صانع التصاريح الأمنية تم التحقق من صحتها وتم ضمان أنها ليست null.

1. الحصول على اسم العرض لعضو من فريق الدعم بشرط أن يكون من أفراد الطاقم

نفّذ طريقة SecurityPassMaker.GetDisplayName(). ينبغي أن تُرجع قيمة الحقل Title لنسخ جميع الأصناف المشتقة من Staff، وإلا فتُرجع "Too Important for a Security Pass".

var spm = new SecurityPassMaker();
spm.GetDisplayName(new Manager());
// => "Too Important for a Security Pass"
spm.GetDisplayName(new Physio());
// => "The Physio"

2. تخصيص اسم العرض لفريق الأمن

عدّل طريقة SecurityPassMaker.GetDisplayName(). ينبغي أن تتصرف كما في المهمة 1، إلا أنه إذا كان فرد الطاقم عضوًا في فريق الأمن (سواء كان من النوع Security أو أحد أنواعه المشتقة) فيجب عرض النص " Priority Personnel" بعد العنوان.

var spm = new SecurityPassMaker();
spm.GetDisplayName(new Physio());
// => "The Physio"
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior Priority Personnel"

3. اعتبار أعضاء فريق الأمن الأساسيين فقط أفرادًا ذوي أولوية

عدّل طريقة SecurityPassMaker.GetDisplayName(). ينبغي أن تتصرف كما في المهمة 2، إلا أنه لا يجب عرض النص " Priority Personnel" لنسخ من النوع SecurityJunior وSecurityIntern وPoliceLiaison.

var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior"
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
C# Exercism

مستعد لبدء مونتشستر يونايتد الآمن؟

سجّل في Exercism لتتعلّم وتتقن C# عبر 62 مفهومًا178 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.