Skip to content

Exercicios

Miguel Gamboa edited this page Apr 19, 2021 · 2 revisions

Exercício 1 - Reflection

No exemplo dado neste exercício considere as classes Student e School definidas por:

class Student {
  public int Nr { get; }
  public string Name { get; }
  public School School { get; }
  public string Nationality { get; }
  ...
}
class School {
  public string Name { get; }
  public string Location { get; }
  public override bool Equals(object obj) { /* iguais se Name e Location iguais */ }
  ...
}

Dada interface IEquality {bool AreEqual(object x, object y);}, implemente a classe Equality que implementa a interface IEquality e considera dois objectos iguais quando as propriedades com o nome passado ao construtor forem iguais entre os objectos x e y, conforme apresentado no exemplo seguinte. (defina Equality com um construtor public Equality(Type entity, params [] props))

...
IEquality eq1 = new Equality(typeof(Student), "Nr", "Name", "School");
bool res1 = eq1.AreEqual(s1, s2); // res1 = true se s1 e s2 tiverem o mesmo Nr, Name e School
IEquality eq2 = new Equality(typeof(Student), "Nr", "Nationality");
bool res2 = eq2.AreEqual(s1, s2); // res2 = true se s1 e s2 tiverem o mesmo Nr e Nationality

Exercício 2 - Reflection and custom attributes

No exemplo dado neste exercício considere a classe Student definida por:

class Student {
  [Comparison(2)] int nr;             // int é IComparable
  string name;                        // string é IComparable
  [Comparison(1)] string nationality; // string é IComparable
  ...
}

Dada a definição da interface IComparer (interface IComparer { int Compare(object x, object y); }), implemente a classe Comparator que implementa IComparer e cujo método Compare compara dois objectos retornando um valor que indica quando um é menor, igual ou maior que o outro.

Use como critério de comparação os valores dos campos anotados com o custom attribute ComparisonAttribute e que sejam do tipo IComparable (interface IComparable{int CompareTo(object obj)}). Implemente também o custom attribute ComparisonAttribute.

Student s1 = new Student(12000, "Ana", "pt");
Student s2 = new Student(14000, "Ana", "pt");
Student s3 = new Student(11000, "Ana", "en");
IComparer cmp = new Comparator(typeof(Student)); // Usa como critérios: 1o nationality e 2o nr
int res1 = cmp.Compare(s1, s2); // res < 0 porque têm a mesma nationality e 12000 é menor que 14000
int res2 = cmp.Compare(s2, s3); // res > 0 porque “pt” é maior que “en”

Exercício 3 - Reflection and custom attributes

Na continuação do exercício anterior implemente uma nova classe Comparator que usa como critério de comparação os valores dos campos que verifiquem uma das condições:

  • Ser do tipo IComparable.
  • Estar anotados com o custom attribute ComparisonAttribute.

O atributo ComparisonAttribute recebe o critério de comparação por parâmetro correspondente ao tipo de uma classe que implementa a interface IComparer. Exemplo:

class Student {
  int nr;             // int é IComparable
  string name;        // string é IComparable
  [Comparison(typeof(AdressByStreet))] Address a; // Address NÃO é IComparable
  [Comparison(typeof(AccountByBalance))] Account acc; // Account NÃO é IComparable
  ...
}

Neste caso, a classe AdressByStreet define um critério de comparação com o comportamento:

((Address) x).street.CompareTo(((Address) y).street)

Considere o exemplo dos seguintes resultados de comparação de instâncias de Student:

Student s1 = new Student(14000, "Ana", new Adress("Rua Amarela", 24), new Account(9900));
Student s2 = new Student(14000, "Ana", new Adress("Rua Rosa", 24), new Account(9900));
Student s3 = new Student(14000, "Ana", new Adress("Rua Rosa", 24), new Account(100));
Student s4 = new Student(14000, "Ana", new Adress("Rua Rosa", 97), new Account(100));
IComparer cmp = new Comparer(typeof(Student)); 
int res1 = cmp.Compare(s1, s2); // res < 0 porque Rua Amarela é menor que Rua Rosa
int res2 = cmp.Compare(s2, s3); // res > 0 porque 9900 é maior que 100
int res3 = cmp.Compare(s3, s4); // res = 0 porque os critérios de comparação de todos os campos dão 0 
Clone this wiki locally