Обробка даних в циклі за допомогою перерахування до Visual C # (Sharp)

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

Проблема полягає В оголошенні інтерфейсів IEnumerableo І lEnumerable

Далі наводиться код оголошень цих інтерфейсів:

public interface lEnumerable { IEnumerator GetEnumerator()

}

public interface IEnumerable&ltT&gt : IEnumerable { IEnumerator&ltT&gt GetEnumerator()

}

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

У мові С # можна перевантажувати метод, єдиною відмінністю якого є повертається тип Наприклад, наступне оголошення неприпустимо:

class Example {

public int Count() { return 0 } public string Count() { return &quot0" }

}

У цьому класі оголошені два методи count про, єдиною відмінністю яких один від одного є тип повертається ними значення Такий коду не скомпілуется, т к компілятор не може розрізнити ці методи Проблема компілятора з рішенням, який метод застосовувати, демонструється в наступному коді:

new ExampleCount()

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

IEnumerator&ltstring&gt IEnumerable&ltstring&gt.GetEnumerator() { foreach (string identifier in _worksheetsKeys) {

yield return identifier

}

}

IEnumerator IEnumerableGetEnumerator() {

return (((IEnumerable&ltstring&gt)this) as IEnumerable)GetEnumerator()

}

Перед кожним методом реалізації вказується ідентифікатор інтерфейсу, для того щоб ідентифікувати метод інтерфейсу, до якого виконується звертаючись Мето д IEnumerableo GetEnumerator () реалізується тому, ЩО клас з IEnumerableo успадковує клас IEnumerator, тому знижене приведення до IEnumerator є можливим Приведення дещо складно, т к метод IEnumerableo () можна отримати тільки за допомогою приведення типів, після чого необхідно виконати понижувальний приведення до IEnumerable, перш ніж визать метод GetEnumerator ()

Все це виглядає дещо заплутаним, але ілюструє типи проблем, вознающіх при роботі з кодом на основі узагальнень NET, в який потрібно ІНТЕГРОВАНІ код, який не використовує таких узагальнень

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*