Nota:
- Alguns exercícios desta secção pedem para desenhar um diagrama UML.
- A imagem contendo o diagrama, em formato PNG, deve ser guardada em modo Git LFS na pasta solucoes/04_uml.
- O respetivo nome de ficheiro deve seguir o número do exercício (por exemplo,
uma imagem para o exercício 5 deve estar no ficheiro
05.png
). - O respetivo ficheiro Markdown com a solução deve simplesmente apresentar essa imagem.
1 - Desenha o diagrama UML de classes completo para o projeto 01.
2 - Considera o diagrama UML em baixo, e depois 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. Considera-se que todas as instruções ocorrem fora das classes presentes no diagrama.
Animal animal = new Dog();
Cat cat = new Dog();
Cat cat = new Animal();
a.Bark(); // 'a' é uma instância de Animal
dog.Eat(); // 'dog' é uma instância de Dog
float y = tareco.energy; // 'tareco' é uma instância de Cat
Console.WriteLine(myCat.Name); // 'myCat' é uma instância de Cat
bobi.energy = 123.4f; // 'bobi' é uma instância de 'Dog'
Dog pluto = new Animal();
y.Meow(); // 'y' é uma instância de Cat
beast.Bite(); // 'beast' é uma instância de Animal
zz.Eat(); // 'zz' é uma instância de Cat
3 - Desenha o diagrama UML de classes (versão simplificada, apenas blocos com nome do tipo, relações entre os tipos, e cardinalidade) para o código do exercício 23 de Programação por Objetos.
4 - Desenha o diagrama UML de classes (versão simplificada, apenas blocos com nome do tipo, relações entre os tipos, e cardinalidade) para o código do exercício 24 de Programação por Objetos.
5 - Desenha o diagrama UML de classes completo para o exercício 25 de Programação por Objetos.
6 - Cria um projeto no Visual Studio que respeite o seguinte diagrama UML. O projeto deve ter funcionalidade mínima para demonstrar as relações indicadas no diagrama.
7 - Desenha o diagrama UML de classes completo para o exercício 31 de Programação por Objetos.
8 - (continuação do exercício 37 de Programação por Objetos)
Considera a seguinte classe:
public abstract class NPC
{
public float HP { get; protected set; }
public NPC(float hp)
{
HP = hp;
}
public void PlayTurn()
{
if (FindEnemies())
{
AttackEnemies();
}
if (FindFood())
{
EatFood();
}
Move();
}
protected abstract bool FindFood();
protected abstract bool FindEnemies();
protected abstract void EatFood();
protected abstract void AttackEnemies();
protected virtual void Move()
{
Console.WriteLine(this.GetType() + " has moved!");
}
}
- Cria pelo menos 3 subclasses concretas (não abstratas), representando
diferentes NPCs num jogo, com lógicas concretas e específicas para cada um
deles. Os métodos
EatFood()
eAttackEnemies()
podem consistir apenas deConsole.WriteLines
. - Cria uma classe
Program
com um métodoMain()
para testar as classes criadas no ponto anterior. Por exemplo, criar uma ou mais instâncias de cada classe, colocar as mesmas numa coleção deNPC
, percorrer a coleção, e invocar o métodoPlayTurn()
em cada uma delas. Repara que, além do construtor, só o métodoPlayTurn()
pode ser invocado a partir de outras classes. - Identifica a presença de polimorfismo na solução que apresentaste no ponto anterior.
- Desenha o diagrama UML da solução apresentada.
9 - O exercício anterior corresponde a um design pattern muito útil e comum, que consiste em definir os passos principais de um algoritmo ou operação, delegando nas subclasses alguns ou todos os passos concretos do mesmo. Por outras palavras, este design pattern permite redefinir alguns passos do algoritmo ou operação sem alterar a estrutura do mesmo. Que design pattern é este?