Приведення та перетворення типів - це різні способи змінити тип виразу з одного на інший.
Вираз можна привести до іншого типу за допомогою оператора приведення (<type>).
long l = 1000L;
int i = (int)l;
object o = new Random();
Random r = (Random)o;
Якщо типи не сумісні, викидається виняток InvalidCastException. У випадку чисел це означає, що тип-одержувач не може представити приведене значення. У випадку класів один із типів має бути похідним від іншого (це так само, хоч і тривіально, стосується структур).
Альтернатива приведенню - перетворення типів за допомогою оператора is. Зазвичай це застосовують до посилальних типів і типів, що допускають значення null.
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(). Для примірників усіх класів, похідних від Staff, він має повертати значення поля Title, а для решти - «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(). Він має поводитися так само, як у завданні 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"
Змініть метод 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"
Зареєструйтеся на Exercism, щоб вивчати й опановувати C#, а також 62 концепції178 вправ та справжнє наставництво від людей, і все це безкоштовно.