46 - Considera a seguinte classe:
public abstract class GameItem
{
public readonly string name;
public readonly string description;
public GameItem(string name, string description)
{
this.name = name;
this.description = description;
}
}
Responde às seguintes questões:
- Implementa a classe
Sword
que estendeGameItem
, tendo adicionalmente como estado os camposlength
,typeOfMetal
econdition
. O primeiro pode ser representado com um número real, e os outros têm um tipo próprio,TypeOfMetal
eWeaponCondition
, respetivamente. O construtor deSword
aceita 5 parâmetros, que são usados para inicializar todos os campos da classe. No entanto, os campos herdados deGameItem
devem ser inicializados pelo respetivo construtor. - Cria as enumerações
TypeOfMetal
eWeaponCondition
com valores à tua escolha mas de modo a que façam sentido no contexto do problema. - Dá um exemplo em código de como podemos criar uma instância de
Sword
. - Normalmente as variáveis de instância têm visibilidade privada de modo a não comprometer a encapsulação. No entanto não é esse o caso no código apresentado. Porque razão a quebra de encapsulação não é tão grave neste caso?
- Podemos instanciar diretamente
GameItem
? Porquê?
public class Sword : GameItem
{
public readonly int length;
public readonly TypeOfMetal typeOfMetal;
public readonly WeaponCondition weaponCondition;
public Sword (string sn, string sd, int l, TypeOfMetal type,
WeaponCondition wc) : base (sn, sd)
{
length = l;
typeOfMetal = type;
weaponCondition = wc;
}
}
public enum WeaponCondition
{
Good,
Bad,
Broken
}
public enum TypeOfMetal
{
Steel,
Iron,
Bronze,
Silver
}
Sword sword = new Sword("Cool Sword", "it's a cool sword", 3,
TypeOfMetal.Silver, WeaponCondition.Good);
-
A quebra de encapsulação não é tão grave no código apresentado porque as duas variáveis pertencentes à classe
GameItem
(name
edescription
) e as três variáveis deSword
(length
,typeOfMetal
eweaponCondition
) são só de leitura. -
Não, porque
GameItem
é uma classe abstrata.
Por Inácio Amerio.