مسیرها
/
C#
C#
/
تمرین‌ها
/
امنیت منچستر یونایتد
امنیت منچستر یونایتد

امنیت منچستر یونایتد

تمرین یادگیری

مقدمه

کست کردن

«کست کردن» و «تبدیل نوع» دو روش متفاوت برای تغییر یک عبارت از یک نوع داده به نوعی دیگر هستند.

یک عبارت را می‌توان با عملگر کست (<type>) به نوع دیگری کست کرد.

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

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

اگر نوع‌ها با هم سازگار نباشند، نمونه‌ای از InvalidCastException پرتاب می‌شود. در مورد اعداد، این یعنی نوع گیرنده نمی‌تواند مقدار کست‌شده را نمایش دهد. در مورد کلاس‌ها، یکی از دو نوع باید از دیگری مشتق شده باشد (این موضوع برای انواع struct هم به‌شکلی بدیهی صادق است).

جایگزینی برای «کست کردن»، «تبدیل نوع» با استفاده از عملگر 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() را تغییر دهید. این متد باید مانند کار ۱ رفتار کند، با این تفاوت که اگر عضو کارکنان، عضوی از تیم امنیت باشد (چه از نوع 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() را تغییر دهید. این متد باید مانند کار ۲ رفتار کند، با این تفاوت که متن « 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 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.