---
# System prepended metadata

title: TAS - COURS 5
tags: [TAS]

---

# 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
    }
}
```



