Interfaces
Interface
A la base, une interface contient une liste de méthodes abstraites. Toutes ces méthodes devront être implémentées dans une classe pour effectuer le service demandé.
Il y a donc séparation entre le code des méthodes et l'interfaçage avec ses méthodes.
Cette solution a été empruntée d'Objective-C: la notion d'interface.
Une interface est similaire à une classe abstraite ou encore à une classe virtuelle pure en C++.
Du fait de sa complète abstraction, il est évident qu'une interface ne pourra pas être instancier (Cela va sans dire, mais cela va mieux en le disant !)
Définir une interface
Définir une interface ce fait de la même manière qu'une classe. Il faudra simplement faire précéder son identificateur du mot-clé interface
Comme pour les classes, plusieurs interfaces peuvent être définies dans un fichier JAVA. Mais une seule interface pourra être public et devra porter le même nom que le fichier JAVA.
Vous pourrez déclarer dans une interface
- Des champs qui seront uniquement des constantes. Donc la déclaration de vos champs doit commencer par: public static final
- Des méthodes. Toutes les méthodes devront avoir public abstract et se terminent par un ; - Pas de code donc !
Ce qui donne:
package fr.free.supertos
public interface MonInterface
{
public static final MACONSTANTE...;
int maMethode(); // Implicitement public et abstract
}
Héritage entre interfaces
Une interface peut hériter (extends) de plusieurs interfaces, d'où la syntaxe suivante:
interface I2 extends I1 {...}
Implémenter une interface
Pour pouvoir utiliser une interface dans une classe nous déclarerons normalement notre classe qui étendra éventuellement une autre classe. Par contre, elle implémentera notre interface d'où le mot clé implements.
class TstClasse extends SuperClasse implements fr.free.supertos.MonInterface
{
...
}
Héritage multiple
Herbivore et carnivore peuvent hériter de la classe animal. Il s'agit d'un héritage simple...
Mais omnivore va hériter de Herbivore et de Carnivore...il s'agit d'un héritage multiple...
Or l'héritage multiple n'existe tout simplement pas en java !
Voilà, c'est vite fait, au suivant...
L'interface permet aussi de résoudre ce problème:
Reproduire l'héritage multiple
Une classe peut implémenter (implements) une ou plusieurs interfaces (et toujours hériter d'une classe via extends)
D'où la syntaxe:
class C2 extends C1 implements I1, I2, ..., In {...}
On retrouvera se genre de solution par exemple pour une classe qui étend déjà une autre classe. Il n'est donc plus possible d'étendre celle-ci avec une seconde classe (héritage multiple interdit).
Exemple avec les Thread, si vous voulez que votre classe puisse s'exécuter dans un thread à part, alors qu'elle étend déjà d'une classe, vous ne pourrez pas étendre la classe Thread. Pour résoudre le problème, vous passerez pas une implementation de l'interface Runnable.
Voir un exemple dans le chapitre sur les threads