Главная » C# » Обработка данных в цикле с помощью перечисления в Visual C# (Sharp)

0

В примере в главе 9 мы видели применение ключевого слова yield совместно с печислителем без общих параметров. Ключевое слово yield можно также исполовать с интерфейсом lEnumerable, использующим обобщения .NET, но для этого необходимо реализовать два отдельных интерфейса.

Проблема заключается  В объявлении интерфейсов  IEnumerableo И lEnumerable.

Далее приводится код объявлений этих интерфейсов:

public interface lEnumerable { IEnumerator GetEnumerator();

}

public interface IEnumerable<T> : IEnumerable { IEnumerator<T> GetEnumerator();

}

Чтобы реализовать интерфейс iEnumerableo, сначала необходимо реализовать интерфейс IEnumerable. Оба интерфейса имеют один метод,  с единственной раицей между ними, заключающейся в возвращаемом типе, где и начинаются наши проблемы.

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

class Example {

public int Count() { return 0; } public string Count() { return "0"; }

}

В этом классе объявлены два метода count о,  единственным  отличием  которых друг от друга является тип возвращаемого ими значения. Такой код не скомпилуется, т. к.  компилятор  не  может различить эти методы.  Проблема компилятора с решением, какой метод применять, демонстрируется в следующем коде:

new Example.Count();

При реализации интерфейса iEnumerableo необходимо различать, какой метод интерфейса реализуется.  Ситуация усугубляется тем,  что оба метода делают одно и то  же. Поэтому необходимо реализовать  один вариант GetEnumerator (), после чего в другой реализации вызывать настоящую реализацию. Далее приведен поый КОД реализации метода IEnumerableo ():

IEnumerator<string> IEnumerable<string>.GetEnumerator() { foreach (string identifier in _worksheets.Keys) {

yield return identifier;

}

}

IEnumerator IEnumerable.GetEnumerator() {

return (((IEnumerable<string>)this) as IEnumerable).GetEnumerator();

}

Перед каждым методом реализации указывается идентификатор  интерфейса, для того чтобы идентифицировать метод интерфейса, к которому выполняется обращие . Мето д IEnumerableo. GetEnumerator () реализуется потому , ЧТО клас с IEnumerableo наследует  класс   IEnumerator, поэтому  пониженное  приведение к IEnumerator является возможным. Приведение несколько сложно, т. к. метод IEnumerableo () можно получить только с помощью приведения типов, после чего необходимо выполнить понижающее приведение к IEnumerable, прежде чем вызать метод GetEnumerator ().

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

Источник: Гросс  К. С# 2008:  Пер. с англ. — СПб.:  БХВ-Петербург, 2009. — 576 е.:  ил. — (Самоучитель)

По теме:

  • Комментарии