[Précédent]
[Index] | [Corrigé] | [Version imprimable]
[Prochain]

9.4
  Transtypage - Enoncé
Niveau 1
 
 
But:
  Transtypage dans une hiérarchie de classes    
Thème:
  Héritage    
Fichiers:
  ABCDEF.java, Typage.java    

4.1 Debugging

La méthode main du programme suivant contient deux erreurs liées à la notion de typage fort. Indiquez pour chaque erreur:

  1. quelle est l'erreur de typage commise
  2. comment corriger cette erreur

Corrigez le fichier Typage.java.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
class Typage {
    public static void main(String[] args) {
        A[] a = new A[5];                       
        a[0] = new B(8);                        
        a[1] = new B(8);                        
        a[2] = new C(4, 2);                     
        a[3] = new C(4, 2);                     
        a[4] = new D();                         
        int somme = 0;                          

        for (int i = 0; i < a.length; i++) {    
            if (a[i] instanceof D) {            
                System.out.println(((D) a[i]).d);   
            } else {                                
                if (a[i] instanceof B) {            
                    somme = somme + ma(a[i]);       
                    if (a[i] instanceof C) {        
                        C c = a[i];                 
                        c.mc();
                    }
                }
            }                                       
            System.out.println(somme);              
        }
    }

    static int ma(B x) {
        return x.b;
    }
}

class A {
    public A() {};
}

class B extends A {
    protected int b;

    public B(int b) {
        super();
        this.b = b;
    }
}

class C extends B {
    protected int c;

    public C(int b, int c) {
        super(b);
        c = b;
    }

    public void mc() {
        System.out.println("Bzz..");
    }
}

class D extends A {
    protected int d = 20;

    public D() {
        super();
    }
}

4.2 Polymorphisme d'inclusion: un peu de pratique

Le programme ABCDEF ci-dessous implémente la hiérarchie de 6 classes.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
class A {
    public A() { }
}

class B extends A {
    public B() {
        super();
    }
}

class C extends B {
    public C() {
        super();
    }
}

class D extends A {
    protected int d = 1;

    public D(int x) {
        super();
        d = x;
    }

    public D() {
    }
}

class E extends D {
    public E() {
        super();
    }
}

class F extends D {
    public F() {
        super();
    }
}

class ABCDEF {
    public static void main(String[] args) {
        // Indiquez si les affectations suivantes sont correctes:
        A a = new A();
        B b = new B();
        C c = new C();
        D d = new D();
        E e = new E();
        F f = new F();

        a = b;
        b = a;
        a = (A) b;
        a = null;
        null = a;
        a = d;
        b = d;
        a = e;
        d = e;

        // Remplissage d'un tableau:
        A[] as = new A[10];
        as[0] = new A();
        as[1] = new B();
        as[2] = new D(2);
        as[3] = new E();
        as[4] = new C();
        as[5] = new D(4);
        as[6] = new B();
        as[7] = new F();
        as[8] = new C();
        as[9] = new F();

        // A vous d'ajouter le code de ces deux méthodes:
        rechercher(as);
        additionner(as);
    }

    private static void rechercher(A[] as) {
        // A remplir
    }

    private static void additionner(A[] as) {
        // A remplir
    }
}

Affectations entre classes

Dans la méthode main du programme ABCDEF, pour chaque affectation à des variables représentant des objets des classes A, B, C, D, E et F, indiquez si elle est correcte. Si ce n'est pas le cas, expliquez pourquoi.

La méthode rechercher

Dans la deuxième partie de la méthode main, le tableau as (de type A[]) est rempli d'objets des classes A, B, C, D, E et F. Ecrivez le code de la méthode rechercher pour qu'elle affiche le nombre d'objets de type B qui se trouvent dans le tableau. Exemple d'exécution:

  Il y a 4 instances de la classe B 

La méthode additionner

Ecrivez la méthode additionner pour qu'elle affiche la somme des variables d'instance d des objets qui se trouvent dans le tableau as. Exemple d'exécution:

  Somme des variables d : 9

 


[Précédent]
[Index] | [Corrigé] | [Version imprimable]
[Prochain]