ссылка на интерфейс - PullRequest
       0

ссылка на интерфейс

2 голосов
/ 21 сентября 2010

У меня вопрос по поводу интерфейсов.Я понял, что вы не можете создавать экземпляры интерфейсов, верно?Однако я вижу на странице, демонстрирующей использование интерфейса IDictionaryEnumerator:

// Loop through all items of a Hashtable
IDictionaryEnumerator en = hshTable.GetEnumerator();
while (en.MoveNext())
{
    string str = en.Value.ToString();
}

Разве это не создает объект с именем en типа IDictionaryEnumerator?Я прочитал о GetEnumerator(), пытаясь понять, что он возвращает:

Возвращает ссылку на объект перечислителя, который используется для итерации объекта Collection.

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

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 21 сентября 2010

Это просто демонстрация полиморфизма - hshTable.GetEnumerator () возвращает вам экземпляр, который смотрит на внешний мир как IDictionaryEnumerator.Этот экземпляр может демонстрировать другое поведение, чем, например, скажем, экземпляр, полученный из myFactory.GetEnumerator ().Оба объекта выглядят как IDictionaryEnumerator, но имеют разные реализации методов, предоставляемых интерфейсом IDictionaryEnumerator.Надеюсь, поможет.

2 голосов
/ 21 сентября 2010

Код создает экземпляр класса, который реализует интерфейс

Один класс может реализовывать несколько интерфейсов, и несколько классов могут реализовывать один и тот же интерфейс

Используя интерфейс, вы менее зависимына конкретную реализацию, но только на интерфейс (контракт)

1 голос
/ 21 сентября 2010

Переменная типа объекта может рассматриваться как содержащая «идентификатор объекта».Единственное, что можно сделать непосредственно с помощью идентификатора объекта, - это присвоить его другому идентификатору объекта или сравнить его с другим идентификатором объекта.Говоря someObject.foo, фактически говорится: «возьмите объект, на который ссылается идентификатор объекта в переменной« someObject », и используйте для него метод« foo ».

Интерфейс может рассматриваться как дополнительная панель подключения, котораяприсоединяется к объекту с набором стандартизированного набора соединений. Если объявлена ​​переменная типа интерфейса, она будет содержать идентификатор объекта, имеющего такую ​​панель, и, говоря «someInterface.foo», говорит:используйте метод "foo" панели (который, в свою очередь, будет подключен - и активирован - к какому-либо методу внутри самого объекта).

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

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