# TAS - COURS 5
###### tags: `TAS`
## <ins>Exercice Surcharge :</ins>
```java
class A {
void m(B x) { /* A1 */ }
void m(C x, B y) { /* A2 */ }
}
class B extends A {
void m (A x) { /* B1 */}
void m (B x , A y) { /* B2 */ }
void m (C x , B y) { /* B3 */ }
}
class C extends B {
void m (C x) { /* C1 */ }
void m (C x, C y) { /* C2 */ }
void m (C x, B y) { /* C3 */ }
}
class D {
public static void main(String[] args) {
A a = new A();
B b = new B();
A a1 = b;
C c = new C();
B b1 = c;
A a2 = b1;
// QUESTION 1
a.m(b); // m(B) - A1
a.m(a1); // clash
b.m(a1); // m(A) - B1
b.m(b); // m(B) - A1
c.m(c); // m(C) - C1
c.m(b1); // m(B) - A1
// QUESTION 2
a.m(b,b); // clash
a.m(c,c); // m(C, B) - A2
a.m(c,b); // m(C, B) - A2
b.m(b,b); // m(B, A) - B2
b.m(c,c); // m(C, B) - B3
b.m(c,b1); // m(C, B) - B3
c.m(b,b); // m(B, A) - B2 *
c.m(c,c); // m(C, C) - C2
c.m(c,b1); // m(C, B) - C3
// BONUS
/* Le choix de la fonction à appeler
* se fait sur la référence (ici b1 pointe sur C),
* les arguments par contre doivent bien matcher
* le type ici (C, B) */
b1.m(c, b1); // m(C, B) - C3
a1.m(c, c); // m(C, B) - B3
a2.m(c, c); // m(C, B) - C3
}
}
```