[Précédent] |
9.4 |
Transtypage - Enoncé | Niveau 1 |
||
But: |
Transtypage dans une hiérarchie de classes | |||
Thème: |
Héritage | |||
Fichiers: |
ABCDEF.java, Typage.java |
La méthode main du programme suivant contient deux erreurs liées à la notion de typage fort. Indiquez pour chaque 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(); } } |
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 } } |
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.
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
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] |