2009-11-01 5 views
1
public class Foo : IFoo 
... 

Quelle est la différence entreQuelle est la différence entre IFoo foo = new Foo() et Foo foo = new Foo()

IFoo foo = new Foo(); 

et

Foo foo = new Foo(); 
+0

Beaucoup de dupes incl. http://stackoverflow.com/questions/1484445/why-are-variables-declared-with-their-interface-name-in-java –

+0

également: http: // stackoverflow.com/questions/1595498/a-difference-in-style-idictionary-vs-dictionnaire –

+1

Il y a quelques subtilités en C# qui ne sont pas impliquées dans Java. Voir mon commentaire sur la réponse de Jon. – Joren

Répondre

10

La différence est juste dans le type déclaré de la variable. Ce type sera ensuite utilisé par le compilateur lorsque vous utilisez l'expression foo. Par exemple, supposons que la classe Foo contienne une méthode dont n'est pas dans IFoo. Avec la première déclaration, ce membre ne sera pas visible - vous devrez composer foo pour taper Foo pour l'appeler. Dans la deuxième déclaration, vous auriez un accès direct. L'inverse est vrai pour les membres de IFoo qui sont implémentés avec explicit interface implementation dans Foo. C'est relativement rare, mais cela arrive.

Avec la première déclaration, vous pouvez également réaffecter la variable à une référence à tout autre objet d'un type implémentant IFoo, par ex.

foo = new SomeOtherIFooImplementation(); 

alors qu'avec la deuxième déclaration, vous ne pouvez attribuer des valeurs qui sont compatibles avec Foo - à savoir, les instances de Foo ou une classe dérivée. (Dans les deux cas, vous pouvez définir la variable comme nulle, bien sûr.)

Souvent, il est avantageux de coder sur une interface plutôt que sur une implémentation particulière. Cela signifie que le compilateur vous empêchera d'utiliser des détails spécifiques à l'implémentation, ce qui signifie qu'il sera probablement plus facile de passer à une implémentation différente à l'avenir.

Le type de la variable affecte aussi des choses comme la résolution de surcharge:

DoSomething(foo); 

peut appeler des méthodes différentes selon que foo est déclarée comme Foo ou IFoo. Fondamentalement, le type à la compilation d'une variable est important de toutes sortes de façons - pratiquement chaque fois que vous utilisez la variable, certains aspects de la signification de ce code dépendra du type de la variable.

+4

Je voudrais ajouter que tous les membres de IFoo qui ont été explicitement implémentés dans Foo ne sont pas visibles avec la deuxième déclaration, mais sont visibles dans le premier. – Joren

+0

@Joren: Bon appel. Éditera. –

+0

Jon, vous avez une augmentation linéaire presque exacte sur votre réputation, en augmentation d'environ 15 700 par mois. Considérant la FAQ dit que vous ne pouvez obtenir un maximum de 200 rep par jour, le plus que vous devriez être en mesure d'obtenir dans un mois de 30 jours est de 6000 rep. Maintenant, comment avez-vous passé deux fois ça? Vous nous montrez ici! –

0

Le premier exemple est une instance de certains objets implémentant IFoo. Le deuxième exemple est une instance d'un objet Foo.

1

Si foo est de type IFoo et que Foo a implémenté des méthodes ou des propriétés qui ne sont pas définies dans IFoo, vous ne pourrez pas y accéder à moins de lancer foo dans Foo.

Si foo est de type IFoo, vous pouvez instancier d'autres types hérités de IFoo et l'affecter à foo. C'est plus abstrait, donc vous ne dépendez pas spécifiquement du type Foo.

Questions connexes