Solutions
Transcription
Solutions
Polymorphisme : Interface & Héritage (source : livre de Horstmann) Exercice 4.1 La méthode de tri compare un objet avec un autre en appelant la méthode compareTo(). Durant la phase de compilation, le type des objets à comparer (o1,o2) n’est pas connu, et il n'est donc pas possible de déterminer quelle méthode compareTo () doit être appelée (o1.comapreTo(o2)). Donc, cette décision est généralement reportée à la phase d’exécution. Durant l’exécution, c’est le principe du « polymorphisme » qui permet au système d'exécution (généralement la machine virtuelle Java) de trouver et d'utiliser la méthode compareTo () correspondant à la classe (type) de l'objet utilisé dans la comparaison. Exercice 4.2 Dans l'appel o.f (), supposons que la variable o est déclarée comme étant de type X. Dans ce cas, l'objet référencé par o doit être une instance de la classe X ou une de ses sous-classes. Le compilateur peut déterminer la méthode exacte à appeler pour f () dans les cas suivants: 1. La classe X est déclarée « final » ; dans ce cas, elle n'a pas et n’aura jamais de sousclasses. 2. Méthode f () est déclarée « final » ; dans ce cas elle ne peut pas être redéfinie dans les sous-classes de X ; chaque objet (de type X ou les sous-types de X) appelant la méthode f() va exécuter f() déclarée dans la classe X. 3. Méthode f () est déclarée comme étant statique. La méthode ne peut pas être appelée sur un objet de X ; elle sera appelée seulement sur la classe X : X.f(). Donc, il n’y a aucune ambigüité quant à la méthode à appeler. Exercice 4.5 import java.util.*; import java.math.*; public class Ex4_5 { public static void main(String[] args) { ArrayList values = new ArrayList(); values.add(new BigDecimal("1230990480229874019780")); values.add(new BigDecimal("1230990480129874019780")); values.add(new BigDecimal("1230990480129874039780")); System.out.println(minimum(values)); } /** Finds the smallest element in the ArrayList @arg a the ArrayList @return the smallest object @precondition the elements of a implement the interface java.lang.Comparable @precondition array a != null */ public static Object minimum(ArrayList a) { Comparable min = (Comparable) a.get(0); for (int i = 1; i < a.size(); i++) { Comparable toTest = (Comparable) a.get(i); if (toTest.compareTo(min) < 0) min = toTest; } return min; } } Exercice 4.6 import java.util.ArrayList; import java.util.Comparator; /** A class for testing the BankAccount class as a Comparable */ public class Ex4_6 { /** Creates an ArrayList of string and find the longest string in the list @param args unused */ public static void main(String[] args) { ArrayList<String> s = new ArrayList<String>(); Comparator<String> c = new Comparator<String>() { public int compare(String s1, String s2) { return s1.length() - s2.length(); } }; s.add("a"); s.add("bbbbbb"); s.add("ccc"); String max = maximum(s,c); System.out.println("The longest string is : " + max); } public static String maximum(ArrayList<String> a, Comparator<String> c) { String max = a.get(0); for (String toTest : a) { if (c.compare(toTest, max) > 0) max = toTest; } return max; } } Exercice 6.1 /** A class for modeling checking accounts */ public class CheckingAccount extends BankAccount { /** Constructs an account with a specified balance @arg initialBalance the starting balance for the account */ public CheckingAccount(double initialBalance) { super.deposit(initialBalance); } /** Adds an amount to the account's balance @arg amount the amount to add */ public void deposit(double amount) { super.deposit(amount); transactionsThisMonth++; } /** Subtracts an amount to the account's balance @arg amount the amount to subtract */ public void withdraw(double amount) { super.withdraw(amount); transactionsThisMonth++; } /** Deducts fees from an account's balance */ public void deductFees() { if (transactionsThisMonth > FREE_TRANSACTIONS_PER_MONTH) super.withdraw((transactionsThisMonth FREE_TRANSACTIONS_PER_MONTH) * TRANSACTION_COST); transactionsThisMonth = 0; } private static final int FREE_TRANSACTIONS_PER_MONTH = 5; private static final double TRANSACTION_COST = 1.0; private static int transactionsThisMonth; }