Les interfaces ne peuvent pas être instanciées par définition. Vous instanciez toujours une classe concrète.
Donc dans les deux instructions votre instance est en réalité de type UnityContainer
. La différence est pour la première déclaration, en ce qui concerne C#, votre container
est quelque chose qui implémente IUnityContainer
, qui pourrait avoir une API différente de UnityContainer
.
Tenir compte:
interface IAnimal
{
void die();
}
class Cat : IAnimal
{
void die() { ... }
void meow() { ... }
}
maintenant:
IAnimal anAnimal = new Cat();
Cat aCat= new Cat();
C# sait anAnimal.die()
sûr des œuvres, parce que die()
est défini dans IAnimal
. Mais il ne vous laissera pas faire anAnimal.meow()
même si c'est un Cat
, alors que aCat
peut invoquer les deux méthodes. Lorsque vous utilisez l'interface comme type, vous perdez en quelque sorte les informations.
Cependant, si vous aviez une autre classe Dog
qui implémente également IAnimal
, votre anAnimal
pourrait faire référence à une instance Dog
ainsi. C'est la puissance d'une interface; vous pouvez leur donner n'importe quelle classe qui l'implémente.
Il existe un cas exceptionnel lorsque vous pouvez * instancier une interface: lorsqu'il s'agit d'une interface COM. – svick
Nice! Je suis sûr que vos mots "perdre l'information" n'ont pas l'intention de rétrograder en utilisant des interfaces. –
@Gert Essayer de le rendre facile à comprendre ... Le résultat est plus compliqué que j'avais espéré. – NullUserException