Interfaces can't be instantiated by definition. You always instantiate a concrete class.
So in both statements your instance is actually of type UnityContainer
.
The difference is for the first statement, as far as C# is concerned, your container
is something that implements IUnityContainer
, which might have an API different from UnityContainer
.
Consider:
interface IAnimal
{
void die();
}
class Cat : IAnimal
{
void die() { ... }
void meow() { ... }
}
Now :
IAnimal anAnimal = new Cat();
Cat aCat= new Cat();
C# knows for sure anAnimal.die()
works, because die()
is defined in IAnimal
. But it won't let you do anAnimal.meow()
even though it's a Cat
, whereas aCat
can invoke both methods.
When you use the interface as your type you are, in a way, losing information.
However, if you had another class Dog
that also implements IAnimal
, your anAnimal
could reference a Dog
instance as well. That's the power of an interface; you can give them any class that implements it.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…