Skip to content

Latest commit

 

History

History
235 lines (193 loc) · 7.27 KB

31.md

File metadata and controls

235 lines (193 loc) · 7.27 KB

Pergunta

31 - Considera o seguinte código:

public abstract class GameObject
{
    public float X { get; protected set; }
    public float Y { get; protected set; }
    public abstract int Priority();
    public virtual bool IsActive() { return true; }
}
public class Trap : GameObject
{
    public override int Priority() { return int.MaxValue; }
    public void DisableTrap() { Console.WriteLine("Trap is now disabled."); }
}
public interface ITaggable
{
    string Tag { get; set; }
}

Responde às seguintes questões (neste exercício aceitam-se soluções separadas a cada uma destas questões):

  1. Apresenta o código da classe PowerUp que estende GameObject e implementa a interface ITaggable. A prioridade deve ser igual ao comprimento da tag. Deves sobrepor o método IsActive() de modo a retorne false se a tag for null ou com comprimento igual a zero, e true caso contrário.
  2. Sobrepõe o método ToString() na classe PowerUp de modo a que devolva uma string que inclua X , Y e Tag. Os números reais devem aparecer com 2 dígitos significativos.
  3. Se armorPack for uma instância da classe PowerUp, qual a instrução que define o valor da sua tag como "Armor+75"?
  4. Indica, justificando, quais das seguintes instruções são válidas e quais são inválidas. As instruções são independentes umas das outras, e naquelas que não implicam criação de objetos presume-se que o(s) objeto(s) em questão já foram instanciados. Assume que todas as instruções ocorrem fora das classes discutidas até ao momento.
// Instrução 1
PowerUp pu = new PowerUp();
// Instrução 2
GameObject go = new GameObject();
// Instrução 3
Trap t = new Trap();
// Instrução 4
ITaggable it = new ITaggable();
// Instrução 5
go.DisableTrap(); // go é uma variável do tipo GameObject
// Instrução 6
PowerUp armorPack = new GameObject();
// Instrução 7
int p = gobj.DisableTrap; // gobj é do tipo Trap
// Instrução 8
Console.WriteLine($"{trap.Tag}"); // trap é uma instância de Trap
// Instrução 9
GameObject go = new Trap();
// Instrução 10
GameObject go = new PowerUp();
// Instrução 11
Console.WriteLine($"{pup.Priority()}"); // pup é uma instância de PowerUp

Soluções

Solução 1

Questão 1

class PowerUp : GameObject, ITaggable
{

    public string Tag { get; set; }

    public override int Priority()
    {
        return Tag.Length;
    }

    public override bool IsActive()
    {
        if (Priority() == null) return false;
        return Priority() > 0;
    }
}

Questão 2

public override string ToString()
{
    return $"X Position: {X:f2} Y Position: {Y:f2} Name: {Tag}";
}

Questão 3

armorPack.Tag = "Armor+75";

Questão 4

  1. Válida - Apenas estamos a instanciar um objeto do tipo PowerUp, como esta classe não requer nenhum argumento obrigatório no construtor e não foi declarada com modificadores de herança, pode ser instanciada da forma apresentada.
  2. Inválida - É impossível instanciar um objeto de classe declarada com modificador de herança abstract.
  3. Válida - Apenas estamos a instanciar um objeto do tipo Trap, como esta classe não requer nenhum argumento obrigatório no construtor e não foi declarada com modificadores de herança, pode ser instanciada da forma apresentada.
  4. Inválida - Interfaces não podem ser instanciadas, estas servem unicamente para serem implementadas, ou estendidas por outras interfaces.
  5. Inválida - O método DisableTrap() pertence a Trap que estende GameObject, não sendo possível chamar o método a partir de uma variável desse tipo.
  6. Inválida - Não se pode instanciar diretamente um objeto de classe declarada com modificador de herança abstract. De modo que não se pode usar o construtor GameObject() neste formato.
  7. Inválida - É impossível converter um método para um tipo inteiro.
  8. Inválida - A instância trap sendo do tipo Trap não possui qualquer propriedade Tag, pois este não implementa a interface ITaggable.
  9. Válida - Como Trap estende GameObject, assim pode-se ter uma instância de Trap do tipo GameObject.
  10. Válida - PowerUp estende GameObject, assim pode-se ter uma instância de PowerUp do tipo GameObject.
  11. Válido - Sendo PowerUp uma classe que implementa ITaggable e que contém o membro Priority(), este pode ser chamado e o seu retorno impresso na consola.

Solução 2

  1. Código da classe PowerUp:
class PowerUp : GameObject, ITaggable
{
    public string Tag { get; set; }

    public override int Priority() => Tag.Length;

    public override bool IsActive() => (Tag == null || Tag.Length == 0) ?
        false : true;
}
  1. Sobreposição do método ToString() da classe PowerUp:
public override string ToString() => $"X: {X:f2}\nY: {Y:f2}\nTag: {Tag}\n";
  1. Instrução que define o valor da tag de armorPack (instância da classe PowerUp):
armorPack.Tag = "Armor+75";
  1. Instruções:
    1. Esta instrução é válida, pois o construtor da classe PowerUp não requer qualquer argumento e não possui modificadores de herança;
    2. Esta instrução é inválida, pois a declaração da classe GameObject tem o modificador de herança abstract, impedindo-a de ser instanciada;
    3. Esta instrução é válida, pois, tal como a instrução 1, o construtor da classe Trap não requer qualquer argumento e não possui modificadores de herança;
    4. Esta instrução é inválida, pois não é possível instanciar uma interface;
    5. Esta instrução é inválida, pois a classe GameObject não possui o método DisableTrap(), apenas a classe Trap;
    6. Esta instrução é inválida, pois, tal como a instrução 2, a declaração da classe GameObject tem o modificador de herança abstract, impedindo-a de ser instanciada;
    7. Esta instrução é inválida, pois tenta converter o método DisableTrap() da classe Trap para tipo inteiro, o que é impossível;
    8. Esta instrução é inválida, pois a interface ITaggable não é implementada na classe Trap, logo uma instância desta classe não pode ter uma Tag como propriedade;
    9. Esta instrução é válida, pois a classe Trap é uma subclasse da superclasse GameObject, logo podemos ter uma instância da classe Trap do tipo GameObject, mas não o contrário como podemos observar nas instruções 2 e 6;
    10. Esta instrução é válida, pois, tal como na instrução 9, a classe PowerUp é uma subclasse da superclasse GameObject, logo podemos ter uma instância da classe PowerUp do tipo GameObject, mas não o contrário como podemos observar nas instruções 2 e 6;
    11. Esta instrução é válida, pois a classe PowerUp tem o método Priority, herdado da superclasse GameObject e sobreposto para retornar o valor do comprimento da Tag, pois implementa a interface ITaggable;

Nota: Código de teste para este exercício encontra-se neste repositório.

Por Pedro Inácio.