Casting e conversão de tipos são formas diferentes de transformar uma expressão de um tipo de dado em outro.
Uma expressão pode receber um cast para outro tipo com o operador de cast (<type>).
long l = 1000L;
int i = (int)l;
object o = new Random();
Random r = (Random)o;
Se os tipos não forem compatíveis, uma instância de InvalidCastException é lançada. No caso de números, isso indica que o tipo de destino não consegue representar o valor convertido. No caso de classes, um dos tipos precisa derivar do outro (o que também vale, trivialmente, para structs).
Uma alternativa ao casting é a conversão de tipos, usando o operador is. Normalmente ela é aplicada a tipos de referência e a tipos anuláveis.
object o = new Random();
if (o is Random rand)
{
int ii = rand.Next();
// now, do something random
}
Se você precisar detectar o tipo exato de um objeto, o is pode ser um pouco permissivo demais, porque ele retornará true para uma classe e para quaisquer classes e interfaces das quais ela derive direta ou indiretamente. Nesse caso, typeof e Object.GetType() são a solução.
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
Nosso clube de futebol football-match-reports está voando alto nas ligas, e você foi convidado a fazer mais um trabalho, desta vez no sistema de impressão de crachás de segurança.
A hierarquia de classes da equipe de bastidores é a seguinte
TeamSupport (interface)
├ Chairman
├ Manager
└ Staff (abstract)
├ Physio
├ OffensiveCoach
├ GoalKeepingCoach
└ Security
├ SecurityJunior
├ SecurityIntern
└ PoliceLiaison
Uma implementação completa da hierarquia é fornecida como parte do código-fonte do exercício.
Todos os dados passados ao gerador de crachás de segurança foram validados e é garantido que não são nulos.
Implemente o método SecurityPassMaker.GetDisplayName(). Ele deve retornar o valor do campo Title das instâncias de todas as classes derivadas de Staff e, caso contrário, "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"
Modifique o método SecurityPassMaker.GetDisplayName(). Ele deve se comportar como na Tarefa 1, exceto que, se o funcionário for membro da equipe de segurança (seja do tipo Security ou de uma de suas derivadas), o texto " Priority Personnel" deve ser exibido depois do título.
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"
Modifique o método SecurityPassMaker.GetDisplayName(). Ele deve se comportar como na Tarefa 2, exceto que o texto " Priority Personnel" não deve ser exibido para instâncias do tipo SecurityJunior, SecurityIntern e PoliceLiaison.
var spm2 = new SecurityPassMaker();
spm2.GetDisplayName(new Security());
// => "Security Team Member Priority Personnel"
spm2.GetDisplayName(new SecurityJunior());
// => "Security Junior"
Crie sua conta no Exercism para aprender e dominar C# com 62 conceitos178 exercícios e mentoria humana de verdade, tudo de graça.