Интерфейсы не могут быть созданы по определению. Вы всегда создаете конкретный класс.
Так что в обоих утверждениях ваш экземпляр на самом деле имеет тип UnityContainer
.
Разница в том, что для первого утверждения, что касается C #, ваш container
- это то, что реализует IUnityContainer
, который может иметь API, отличный от UnityContainer
.
Рассмотрим:
interface IAnimal
{
void die();
}
class Cat : IAnimal
{
void die() { ... }
void meow() { ... }
}
Сейчас:
IAnimal anAnimal = new Cat();
Cat aCat= new Cat();
C # точно знает, что anAnimal.die()
работает, потому что die()
определено в IAnimal
. Но это не позволит вам сделать anAnimal.meow()
, хотя это Cat
, тогда как aCat
может вызывать оба метода.
Когда вы используете интерфейс в качестве типа, вы, в некотором смысле, теряете информацию.
Однако, если у вас есть другой класс Dog
, который также реализует IAnimal
, ваш anAnimal
может также ссылаться на экземпляр Dog
. Это сила интерфейса; Вы можете дать им любой класс, который его реализует.