Создание экземпляров интерфейса и создание экземпляров классов - PullRequest
22 голосов
/ 27 августа 2011

Может ли кто-нибудь помочь мне понять, совпадают ли следующие коды.Если нет, то в чем разница между экземпляром класса и интерфейсом.

IUnityContainer container = new UnityContainer()
UnityContainer container = new UnityContainer()

Насколько я понимаю, Inteface имеет только сигнатуру метода, и если интерфейс был реализован 3 классами.Не слишком уверен, какой из 3 экземпляров будет создан первым оператором выше.

Спасибо.

Ответы [ 4 ]

50 голосов
/ 27 августа 2011

Интерфейсы не могут быть созданы по определению. Вы всегда создаете конкретный класс.

Так что в обоих утверждениях ваш экземпляр на самом деле имеет тип 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. Это сила интерфейса; Вы можете дать им любой класс, который его реализует.

4 голосов
/ 27 августа 2011

На самом деле не существует такого понятия, как "создание интерфейса", но есть переменные интерфейса. Первая строка - пример одной такой переменной.

В первой строке вы можете создать экземпляр container для любого конкретного класса, реализующего IUnityContainer. Со второй строкой объект container может быть создан только из класса UnityContainer или производного класса.

Когда вы используете интерфейсные переменные в своем коде, это позволяет вам легче переключаться на конкретную реализацию, что делает ваш код более гибким.

0 голосов
/ 21 ноября 2014

Создание интерфейса невозможно.Но когда мы создали объект для интерфейса, используя его реализованный класс, он работает.

IUnityContainer container = new UnityContainer()// It is assigning an object of its implemented class.
UnityContainer container = new UnityContainer() // To access directly by using like this.

Предположим, что существует множественное наследование, для достижения этого нам нужно идти первым.

ТамНет необходимости предоставлять такие вещи, мы идем вторым путем.

Интерфейсы ограничивают прямой доступ к данным и членам своего класса.

0 голосов
/ 27 августа 2011

Объект, созданный и сохраненный в переменной IUnityContainer container, рассматривается компилятором как имеющий только элементы, определенные в интерфейсе IUnityContainer.То есть, если класс UnityContainer содержит члены, которые не определены интерфейсом IUnityContainer, вы не сможете вызывать их.С другой стороны, вы можете «поместить» любой объект, реализующий интерфейс IUnityContainer, в переменную IUnityContainer container, а не только экземпляры UnityContainer.Со вторым объявлением вы застряли с экземплярами UnityContainer и объектами в его иерархии наследования.

Посмотрите Руководство по программированию интерфейсов *1011* для получения дополнительной информации об интерфейсах и о том, как онииспользуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...