Percursos
/
C#
C#
/
Exercícios
/
Proteger o Munchester United
Proteger o Munchester United

Proteger o Munchester United

Exercício de aprendizagem

Introdução

Conversão explícita

A conversão explícita e a conversão de tipos são duas formas diferentes de passar uma expressão de um tipo de dados para outro.

Uma expressão pode ser convertida para outro tipo com o operador de conversão (<type>).

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

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

Se os tipos não forem compatíveis, é lançada uma instância de InvalidCastException. No caso dos números, isto indica que o tipo de destino não consegue representar o valor convertido. No caso das classes, um dos tipos tem de derivar do outro (o que também se aplica, de forma trivial, às structs).

Uma alternativa à conversão explícita é a conversão de tipos com o operador is. Esta aplica-se tipicamente 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 precisares de detetar o tipo exato de um objeto, o is pode ser demasiado permissivo, uma vez que devolve true para uma classe e para qualquer uma das classes e interfaces das quais ela deriva, direta ou indiretamente. Neste caso, a solução passa por typeof e 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

Instruções

O nosso clube de futebol football-match-reports está a subir nas ligas e foste convidado a fazer mais algum trabalho, desta vez no sistema de impressão de passes de segurança.

A hierarquia de classes do pessoal 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 criador de passes de segurança foram validados e é garantido que não são nulos.

1. Obter o nome de apresentação de um membro da equipa de apoio, desde que seja um membro do pessoal

Implementa o método SecurityPassMaker.GetDisplayName(). Deve devolver 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"

2. Personalizar o nome de apresentação da equipa de segurança

Modifica o método SecurityPassMaker.GetDisplayName(). Deve comportar-se como na Tarefa 1, exceto que, se o membro do pessoal pertencer à equipa de segurança (seja do tipo Security ou de um dos seus derivados), o texto " Priority Personnel" deve ser apresentado 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"

3. Designar apenas os membros principais da equipa de segurança como pessoal prioritário

Modifica o método SecurityPassMaker.GetDisplayName(). Deve comportar-se como na Tarefa 2, exceto que o texto " Priority Personnel" não deve ser apresentado 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"
Editar via GitHub A ligação abre numa nova janela ou separador
C# Exercism

Estás pronto para começar Proteger o Munchester United?

Inscreve-te no Exercism para aprenderes e dominares C# com 62 conceitos178 exercícios, e mentoria humana real, tudo grátis.