-
Notifications
You must be signed in to change notification settings - Fork 1
Exercicios
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
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”
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