Инициация интерфейса для экземпляра класса
Может кто-нибудь, пожалуйста, помогите понять, являются ли следующие коды одинаковыми. Если нет, то какая разница между созданием экземпляра класса и интерфейса.
IUnityContainer container = new UnityContainer()
UnityContainer container = new UnityContainer()
Насколько я понимаю, Inteface имеет только сигнатуру метода, и если интерфейс реализован тремя классами. Не слишком уверен, какой из трех экземпляров будет создан с помощью первого утверждения выше.
Thankyou.
Ответы
Ответ 1
Интерфейсы не могут быть созданы по определению. Вы всегда создаете конкретный класс.
Итак, в обоих утверждениях ваш экземпляр действительно имеет тип UnityContainer
.
Разница заключается в первом утверждении, что касается С#, ваш container
- это то, что реализует IUnityContainer
, у которого API может отличаться от UnityContainer
.
Рассмотрим:
interface IAnimal
{
void die();
}
class Cat : IAnimal
{
void die() { ... }
void meow() { ... }
}
Теперь:
IAnimal anAnimal = new Cat();
Cat aCat= new Cat();
С# точно знает anAnimal.die()
, потому что die()
определяется в IAnimal
. Но это не позволит вам сделать anAnimal.meow()
, хотя это Cat
, тогда как aCat
может вызывать оба метода.
Когда вы используете интерфейс в качестве своего типа, вы, в некотором роде, теряете информацию.
Однако, если у вас был еще один класс Dog
, который также реализует IAnimal
, ваш anAnimal
может ссылаться на экземпляр Dog
. Это сила интерфейса; вы можете дать им любой класс, который его реализует.
Ответ 2
На самом деле нет такой вещи, как "создание интерфейса", но есть интерфейсные переменные. Первая строка - пример одной такой переменной.
В первой строке вы можете создать экземпляр container
для любого конкретного класса, который реализует IUnityContainer
. Во второй строке объект container
может быть создан только из класса UnityContainer
или производного класса.
Когда вы используете переменные интерфейса в своем коде, это позволяет вам более легко переключать конкретную реализацию, что делает ваш код более гибким.
Ответ 3
Объект, созданный и сохраняемый в переменной IUnityContainer container
, рассматривается компилятором только для членов, определенных в интерфейсе IUnityContainer
. То есть, если класс UnityContainer
содержит члены, которые не определены интерфейсом IUnityContainer
, вы не сможете их вызывать. С другой стороны, вы можете "поместить" любой объект, который реализует интерфейс IUnityContainer
в переменной IUnityContainer container
, а не только экземпляры UnityContainer
. Со вторым объявлением вы застряли в экземплярах UnityContainer
и объектов в иерархии наследования.
Ознакомьтесь с С# Programming Guide to Interfaces для получения дополнительной информации об интерфейсах и способах их использования.
Ответ 4
Создание интерфейса невозможно. Но когда мы создали объект для интерфейса, используя его реализованный класс, он работает.
IUnityContainer container = new UnityContainer()// It is assigning an object of its implemented class.
UnityContainer container = new UnityContainer() // To access directly by using like this.
Предположим, что существует множественное наследование, для этого нам нужно идти первым.
Нет необходимости предоставлять такие вещи, которые мы идем вторым способом.
Интерфейсы ограничивают прямой доступ к данным и членам его класса.