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):
- Apresenta o código da classe
PowerUp
que estendeGameObject
e implementa a interfaceITaggable
. A prioridade deve ser igual ao comprimento da tag. Deves sobrepor o métodoIsActive()
de modo a retornefalse
se a tag fornull
ou com comprimento igual a zero, etrue
caso contrário. - Sobrepõe o método
ToString()
na classePowerUp
de modo a que devolva uma string que incluaX
,Y
eTag
. Os números reais devem aparecer com 2 dígitos significativos. - Se
armorPack
for uma instância da classePowerUp
, qual a instrução que define o valor da sua tag como "Armor+75"? - 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
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;
}
}
public override string ToString()
{
return $"X Position: {X:f2} Y Position: {Y:f2} Name: {Tag}";
}
armorPack.Tag = "Armor+75";
- 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. - Inválida - É impossível instanciar um objeto de classe declarada com modificador de
herança
abstract
. - 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. - Inválida - Interfaces não podem ser instanciadas, estas servem unicamente para serem implementadas, ou estendidas por outras interfaces.
- Inválida - O método
DisableTrap()
pertence aTrap
que estendeGameObject
, não sendo possível chamar o método a partir de uma variável desse tipo. - 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 construtorGameObject()
neste formato. - Inválida - É impossível converter um método para um tipo inteiro.
- Inválida - A instância
trap
sendo do tipoTrap
não possui qualquer propriedadeTag
, pois este não implementa a interfaceITaggable
. - Válida - Como
Trap
estendeGameObject
, assim pode-se ter uma instância deTrap
do tipoGameObject
. - Válida -
PowerUp
estendeGameObject
, assim pode-se ter uma instância dePowerUp
do tipoGameObject
. - Válido - Sendo
PowerUp
uma classe que implementaITaggable
e que contém o membroPriority()
, este pode ser chamado e o seu retorno impresso na consola.
- 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;
}
- Sobreposição do método
ToString()
da classePowerUp
:
public override string ToString() => $"X: {X:f2}\nY: {Y:f2}\nTag: {Tag}\n";
- Instrução que define o valor da tag de
armorPack
(instância da classePowerUp
):
armorPack.Tag = "Armor+75";
- Instruções:
- Esta instrução é válida, pois o construtor da classe
PowerUp
não requer qualquer argumento e não possui modificadores de herança; - Esta instrução é inválida, pois a declaração da classe
GameObject
tem o modificador de herançaabstract
, impedindo-a de ser instanciada; - 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; - Esta instrução é inválida, pois não é possível instanciar uma interface;
- Esta instrução é inválida, pois a classe
GameObject
não possui o métodoDisableTrap()
, apenas a classeTrap
; - Esta instrução é inválida, pois, tal como a instrução 2,
a declaração da classe
GameObject
tem o modificador de herançaabstract
, impedindo-a de ser instanciada; - Esta instrução é inválida, pois tenta converter o método
DisableTrap()
da classeTrap
para tipo inteiro, o que é impossível; - Esta instrução é inválida, pois a interface
ITaggable
não é implementada na classeTrap
, logo uma instância desta classe não pode ter umaTag
como propriedade; - Esta instrução é válida, pois a classe
Trap
é uma subclasse da superclasseGameObject
, logo podemos ter uma instância da classeTrap
do tipoGameObject
, mas não o contrário como podemos observar nas instruções 2 e 6; - Esta instrução é válida, pois, tal como na instrução 9, a classe
PowerUp
é uma subclasse da superclasseGameObject
, logo podemos ter uma instância da classePowerUp
do tipoGameObject
, mas não o contrário como podemos observar nas instruções 2 e 6; - Esta instrução é válida, pois a classe
PowerUp
tem o métodoPriority
, herdado da superclasseGameObject
e sobreposto para retornar o valor do comprimento daTag
, pois implementa a interfaceITaggable
;
- Esta instrução é válida, pois o construtor da classe
Nota: Código de teste para este exercício encontra-se neste repositório.
Por Pedro Inácio.