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;
}