«کست کردن» و «تبدیل نوع» دو روش متفاوت برای تغییر یک عبارت از یک نوع داده به نوعی دیگر هستند.
یک عبارت را میتوان با عملگر کست (<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 نیستند.
لطفاً متد 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"
لطفاً متد 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"
لطفاً متد 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"