J'ai créé une méthode dans une interface qui va lire dans une liste de chemins (path) dans un autre fichier "enum" qui s'appelle CheminsBin et qui renvoie le bon chemin.
Fallait-il créer une interface ou un autre type de classe?
interface CheminBin {
static String trouveCheminBin() {
// TODO Auto-generated method stub
/** Vérifie le PC
* Le programme ne fonctionne pas si le chemin du bureau change lorsqu'on change de PC
* C'est pour cela que le chemin a été coupé et s'arrête au Desktop pour vérifications.
*
* Model: for(Langage lang : Langage.values()){
*/
for(CheminsBin path: CheminsBin.values()) {
File desktopPathVerify = new File(path.toString());
String dir = null;
if(desktopPathVerify.exists())
dir = path.toString();
return dir;
}
return "";
}
}
Pour faire simple, une interface permet de créer un standard pour les classes qui l'implémenteront. Comme dans le cours, on admet qu'un Chien et un chat sont des animaux. Mais on est d'accord pour dire qu'un chien ou un chat ne cri pas pareil et ne se déplace pas pareil mais les deux le font !
De ce fait, on créé une interface Animal, qui va définir des méthodes crier() et deplacement(). Cela créé notre standard de fonctionnement d'un Animal.
Maintenant on peut dire qu'un Chien est un Animal, il va donc implémenter l'interface Animal et a nous de définir comment un chien peut crier() et faire un déplacement(). Idem pour le chat.
Pour résumer :
public interface Animal{
//On défini le standard
public void crier();
public void deplacement();
}
public class Chien implements Animal{
//Maintenant on spécifie les méthodes
public void crier(){
System.out.println("Aboyer");
}
public void deplacement(){
System.out.println("Je cours vite");
}
}
public class Chat implements Animal{
//Maintenant on spécifie les méthodes
public void crier(){
System.out.println("Je miaule");
}
public void deplacement(){
System.out.println("Je ne me déplace pas, je dors");
}
}
Et maintenant, on peut les utiliser de la sorte :
Animal monAnimal1 = new Chien();
Animal monAnimal2 = new Chat();
monAnimal1.crier();
//Aboyer
monAnimal2.crier();
//Je miaule
Ce qu'on en retient :
Une interface défini un standard pour les classes qui l'implémenteront
Elle permet de définir un "modèle de fonctionnement", de forcer la spécialisation de certaines fonctions
Ce n'est pas pareil qu'une classe abstraite ou une classe non abstraite (encore moins)
Donc, quand est-ce que je créé une classe et quand est-ce que je créé une interface ?
Il faut créer une interface quand on cherche à réutiliser un modèle de fonctionnement, quelque chose de standard pour les objets qui les implémenteront.
Je créé une classe quand j'ai un fonctionnement défini, qui n'est standard que pour ma classe (l'interface n'est pas utile dans ce cas).
Il y aussi l'histoire de l'héritage : Java ne supporte pas l'héritage multiple, mais supporte l'implémentation multiple.
J'ai survolé très fort pour le coup, certains diront que c'est plus complexe, c'est vrai. Et je t'invite à revoir les textes du cours.
Maintenant, dois-tu créer une classe ou une interface ? Et bien pour ça je t'invite à voir comment sont implémenter les fonctionnements de ce genre dans le code source de Java. Particulièrement les fichiers Arrays.java et Strings.java. Package java.util.
Que mes camarades de OpenClassrooms qui ont plus de détails viennent me contredire ou ajouter des infos utiles, j'en apprendrai surement aussi.
Alors je savais pas que c'était possible en java mais en php il est impossible d'y mettre du code dans une fonction d'une interface.
Pour pallier à ça le php propose les "traits" qui permettent une sorte d'héritage horizontal. Je préfère laisser des spécialistes java répondre sur comment le faire mais ça m'étonne que java autorise ceci pour une interface.
Ce n'est pas autorisé, du moins, conventionnellement. Je n'ai jamais essayé. Cela dit, il me semble que l'on n'est pas autorisé à le faire pour la simple est bonne raison que ça n'a pas de sens de le faire.
Cela dit il y a un cas où l'on peut le faire, et c'est grâce au mot-clef "default", exemple :
public default void ecrire(){
System.out.println("Ecrire");
{
Ce mot clé permet aux classes qui implémentent l'interface, de ne pas avoir à implémenter la méthode qui est marquée "default". On le retrouve notamment dans le code source Java, pour la fonction Collection#removeIf (Collection étant une interface) :
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
Et on voit bien que les classes qui l'implémente (quand on cherche) ne redéfinissent pas la fonction removeIf. Mais on peut toujours l'override par l'instruction @Override .
D'autres problèmes peuvent survenir, notamment si on nomme deux méthodes avec le même nom dans deux interfaces différentes et qu'ensuite on cherche à appeler cette méthode dans la classe qui les implémente toutes les deux. Mais là, je vous renvoi vers Internet, il y a plein d'articles.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Site personnel : Julien Gidel - AutoMate - PHPresentation
Site personnel : Julien Gidel - AutoMate - PHPresentation
My website : Mon serveur discord, Se demerder tout seul, Faille XSS et SQL
Site personnel : Julien Gidel - AutoMate - PHPresentation