2010-01-26 9 views
0

Je dois travailler avec une API qui est accompagnée de quelques exemples. Dans l'un des exemples, une interface est directement utilisée pour appeler l'une des méthodes de cette interface. Cependant, comme Interface ne contient aucune implémentation, j'aimerais savoir: Comment les méthodes peuvent-elles être utilisées dans l'exemple pour accomplir quelque chose sans définir une classe qui implémente cette interface?Java Interface Question

Ou l'interface peut-elle également contenir une définition complète de la méthode? (Ce qui semble être le cas ici)

+0

pouvez-vous poster un échantillon de code? même quelque chose avec des noms changés aide à obtenir une réponse précise. – Jean

Répondre

4

Non, l'interface contient uniquement des signatures de méthode. Vous ne pouvez pas avoir une implémentation dans une interface.

Ce qui est (le plus probable) qui se passe dans votre cas est quelque chose comme (pseudo-code):

InterfaceA { 
    methodA(); 
} 

class A implements InterfaceA { 
    methodA() // implementation 
} 

InterfaceA getInterface() { 
    // some code which returns an object of a class which implements InterfaceA 
} 

méthode d'appel:

InterfaceA in = getInterface() // you might get an instance of class A or any other class which implements InterfaceA 

in.methodA(); // implementation from whatever class the method returned 
2

Voulez-vous dire quelque chose comme ça ...

InterfaceA a = getInterface(); 
a.method(); 

Dans ce cas, a sera une instance d'une classe qui implémente InterfaceA - ce que la classe est doesn Peu importe, tout ce qui vous intéresse, ce sont les méthodes d'interface.

+0

minuscule la méthode;) – Bozho

+0

:) trop de C# ... – thecoop

2
  • l'implémentation concrète de l'interface doit exister. Il est cependant référencé par son interface, et c'est pourquoi il ressemble à des méthodes d'appel sur l'interface.
  • interfaces ne peuvent pas avoir des implémentations ("définitions de méthode complète")

Look où l'objet est créé. Vous pouvez avoir:

public void doSomething() { 
    MyInterface interface = new MyInterfaceImplementation(); 
    doSomething(interface); 
} 

public void doSomethingElse(MyInterface interface) { 
    interface.someMethod(); 
} 

Ainsi en regardant la méthode doSomethingElse() il peut sembler qu'il ne dispose pas d'une mise en œuvre, mais celui qui a appelé la méthode à condition que la mise en œuvre (MyInterfaceImplementation dans ce cas);

1

Une interface définit simplement un contrat. Vous devez avoir une implémentation pour faire les choses réelles.

Ce à quoi vous faites référence doit être le "Program to an interface, not an implementation", ce qui constitue une bonne pratique.

Ou peut-être que l'API utilise Dependency Injection pour fournir l'implémentation, mais vous voyez juste comment le code est utilisé.

1

Peut-être vous dire quelque chose comme ceci:

(new Runnable(){ 
     public void run() { 
      System.out.println("I'm running already!"); 
     } 
    }).run(); 

Si oui, cela s'appelle un anonymous inner class.

1

Il y a deux choses que vous pourriez parler au sujet:

public static void sort(List list, Comparator c){ ... } 

Ici, le paramètre list a le type d'interface List mais celui qui appelle la méthode devra passer dans une instance d'une classe concrète comme ArrayList que implémente l'interface, et le code de la méthode appellera les méthodes de cette classe concrète - ce mécanisme est appelé «dispatch de méthode dynamique» et se trouve au cœur du principe de base du polymorphisme OO.

sort(myList, new Comparator(){ 
    public int compare(Object o1, Object o2){ 
     ... 
    } 
}); 

Voici un exemple d'une classe anonyme : le code définit en fait une nouvelle classe sans nom qui implémente l'interface Comparator, et en même temps crée une instance de cette classe. Ceci est utilisé en Java principalement pour les choses où d'autres langages utiliseraient des constructions de langage telles que des pointeurs de fonction, des fermetures ou des rappels: pour passer un morceau de code à exécuter dans la méthode que vous appelez.