Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π—Π«Πš ΠŸΠ ΠžΠ“Π ΠΠœΠœΠ˜Π ΠžΠ’ΠΠΠ˜Π― Π‘# 2005 И ΠŸΠ›ΠΠ’Π€ΠžΠ ΠœΠ .NET 2.0. 3-Π΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 66

Автор Π­Π½Π΄Ρ€ΡŽ ВроСлсСн

ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ интСрфСйсов

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ нашС обсуТдСниС вопросов создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… интСрфСйсов ΠΈ рассмотрим Ρ‚Π΅ΠΌΡƒ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ интСрфСйсов. Π’Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ класс ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² Ρ€ΠΎΠ»ΠΈ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса для Π΄Ρ€ΡƒΠ³ΠΈΡ… классов (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌΠΈ классами для Π΄Ρ€ΡƒΠ³ΠΈΡ… классов), Π½ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ наслСдования ΠΈ срСди интСрфСйсов. Как ΠΈ слСдуСт ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, интСрфСйс Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ опрСдСляСт ΠΎΠ±Ρ‰Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π° интСрфСйсы, находящиСся Π½Π° Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΡ… уровнях, "ΡƒΡ‚ΠΎΡ‡Π½ΡΡŽΡ‚" это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотритС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ интСрфСйсов.

// Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ интСрфСйс.

public interface IDrawable { void Draw(); }

public interface IPrintable: IDrawable { void Print(); }

public interface IMetaFileRender: IPrintable { void Render(); }

Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° наслСдования ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° рис. 7.5.

Рис. 7.5. Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ интСрфСйсов

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, Ссли Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ класс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ всС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ повСдСния, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… этой ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ интСрфСйсов, Ρ‚ΠΎ этот класс Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΈΠ· интСрфСйса, Π»Π΅ΠΆΠ°Ρ‰Π΅Π³ΠΎ Π² основС ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ (Π² Π΄Π°Π½Π½ΠΎΠΌ случаС это IMetaFileRender). ВсС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΌ интСрфСйсом (ΠΈΠ»ΠΈ интСрфСйсами), автоматичСски пСрСносятся Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. НапримСр:

// Π­Ρ‚ΠΎΡ‚ класс ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ IDrawable, IPrintable ΠΈ IMetaFileRender.

public class SuperImage: IMetaFileRender {

 public void Draw() { Console.WriteLine("Базовая Π»ΠΎΠ³ΠΈΠΊΠ° Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ."); }

 public void Print() { Console.WriteLine("Π’Ρ‹Π²ΠΎΠ΄ Π½Π° ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€."); }

 public void Render() { Console WriteLine("Π’Ρ‹Π²ΠΎΠ΄ Π² ΠΌΠ΅Ρ‚Π°Ρ„Π°ΠΉΠ»."); }

}

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ интСрфСйса ΠΈΠ· экзСмпляра SuperImage.

// ИспользованиС интСрфСйсов.

static void Main(string[] args) {

 SuperImage si = new SuperImage();

 // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ IDrawable.

 IDrawable itfDraw = (IDrawable)si;

 itfDraw.Draw();

 // ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ IMetaFileRender, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹,

 // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ интСрфСйсов.

 if (itfDraw is IMetaFileRender) {

  IMetaFileRender itfMF = (IMetaFileRender)itfDraw;

  itfMF.Render();

  itfMF.Print();

 }

 Console.ReadLine();

}

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ с мноТСством Π±Π°Π·ΠΎΠ²Ρ‹Ρ… интСрфСйсов

ΠŸΡ€ΠΈ построСнии ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ интСрфСйсов Π²ΠΏΠΎΠ»Π½Π΅ допустимо ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ интСрфСйсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… интСрфСйсов. Однако Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ, Ρ‡Ρ‚ΠΎ нСльзя ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ классы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ строитС Π½Π°Π±ΠΎΡ€ интСрфСйсов, ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ автомобиля.

public interface ICar { void Drive(); }

public interface IUnderwaterCar { void Dive(); }

// Π—Π΄Π΅ΡΡŒ интСрфСйс ΠΈΠΌΠ΅Π΅Ρ‚ ДВА Π±Π°Π·ΠΎΠ²Ρ‹Ρ… интСрфСйса.

public interface IJamesBondCar: ICar, IUnderwaterCar { void TurboBoost(); }

На рис. 7.6 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° интСрфСйсов.

Рис. 7.6. ΠžΠ±Ρ‰Π°Ρ систСма Ρ‚ΠΈΠΏΠΎΠ² (CTS) допускаСт мноТСствСнноС наслСдованиС интСрфСйсных Ρ‚ΠΈΠΏΠΎΠ²

ΠŸΡ€ΠΈ построСнии класса, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ IJamesBondCar (машина ДТСймса Π‘ΠΎΠ½Π΄Π°), Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ TurboBoost(), Dive() ΠΈ Drive().

public class JamesBondCar: IJamesBondCar {

 public void Drive() { Console.WriteLine("УскорСниС…"); }

 public void Dive() { Console.WriteLine("ΠŸΠΎΠ³Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅β€¦"); }

 public void TurboBoost() { Console.WriteLine{"Π’Π·Π»Π΅Ρ‚!"); }

}

Π­Ρ‚ΠΎΡ‚ спСциализированный Π°Π²Ρ‚ΠΎΠΌΠΎΠ±ΠΈΠ»ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΈ оТидаСтся.

static void Main(string[] args) {

 β€¦

 JamesBΠΎndCar j = new JamesBondCar();

 j.Drive();

 j.TurboBoost();

 j.Dive();

}

РСализация интСрфСйсов Π² Visual Studio 2005

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° основС интСрфСйсов – это мощная Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° программирования, Π½ΠΎ процСсс Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйсов ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒ Π²Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π² ΠΎΡ‡Π΅Π½ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΌΠ°Ρ…. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ интСрфСйсы ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½Π°Π±ΠΎΡ€Ρ‹ абстрактных Ρ‡Π»Π΅Π½ΠΎΠ², Π²Π°ΠΌ придСтся Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° интСрфСйса ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ класса, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.

Π’Ρ‹ Π½Π΅ ΠΎΡˆΠΈΠ±Π°Π΅Ρ‚Π΅ΡΡŒ, Ссли ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π² Visual Studio 2005 ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ срСдства Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйсов. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс ICar для Π½ΠΎΠ²ΠΎΠ³ΠΎ класса с ΠΈΠΌΠ΅Π½Π΅ΠΌ MiniVan. По Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π²Π²ΠΎΠ΄Π° ΠΈΠΌΠ΅Π½ΠΈ интСрфСйса (ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ указатСля ΠΌΡ‹ΡˆΠΈ Π½Π° имя интСрфСйса Π² ΠΎΠΊΠ½Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°) Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ΄ ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π±ΡƒΠΊΠ²ΠΎΠΉ ΠΈΠΌΠ΅Π½ΠΈ появился Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ "смарт-Ρ‚Π΅Π³". ΠŸΡ€ΠΈ Ρ‰Π΅Π»Ρ‡ΠΊΠ΅ Π½Π° Π½Π΅ΠΌ раскрываСтся список, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс явно ΠΈΠ»ΠΈ нСявно (рис. 7.7).

Рис. 7.7. РСализация интСрфСйсов Π² Visual Studio 2005

ПослС Π²Ρ‹Π±ΠΎΡ€Π° Π½ΡƒΠΆΠ½ΠΎΠΉ Π²Π°ΠΌ ΠΎΠΏΡ†ΠΈΠΈ Visual Studio 2005 сгСнСрируСт ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ (Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΉ области ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ (ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ рСализация ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ System.Exception).

namespace IFaceHierarchy {

 public class MiniVan: ICar {

  public MiniVan() {}

#region ICar Members

  public void Drive() {

   new Exception("The method or operation is not implemented.");

  }

#endregion

 }

}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, послС обсуТдСния спСцифики построСния ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… интСрфСйсов, ΠΌΡ‹ посвятим остаток Π³Π»Π°Π²Ρ‹ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ встроСнных интСрфСйсов, содСрТащихся Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов .NET.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ IFaceHierarchy Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ Π² ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ Π³Π»Π°Π²Π΅ 7.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ пСрСчислимых Ρ‚ΠΈΠΏΠΎΠ² (Enumerable ΠΈ IEnumerator)

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ процСсса Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… интСрфСйсов .NET, Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Ρ€ΠΎΠ»ΡŒ IEnumerable ΠΈ IEnumerator. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρƒ нас Π΅ΡΡ‚ΡŒ класс Garage (Π³Π°Ρ€Π°ΠΆ), содСрТащий Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ‚ΠΈΠΏΠΎΠ² Car (см. Π³Π»Π°Π²Ρƒ Π±), Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π² Π²ΠΈΠ΄Π΅ System.Array.

// Garage содСрТит Π½Π°Π±ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Car.

public class Garage {

 private Car[] carArray;

 // ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Car.

 public Garage() {

  carArray = new Car[4];

  carArray[0] = new Car("Rusty", 30);

  carArray[1] = new Car("Clunker", 55);

  carArray[2] = new Car("Zippy", 30);

  carArray[3] = new Car("Fred", 30);

 }

}

Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΠΎ элСмСнтам, содСрТащимся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Garage, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ C# foreach.

// Π­Ρ‚ΠΎ каТСтся разумным…

public class Program {

static void Main(string[] args) {

 Garage carLot = new Garage();

 // Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Car Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ?

 foreach (Car c in carLot) {

  Console.WriteLine("{0} ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ {1} ΠΊΠΌ/Ρ‡", с.PetName, с.CurrSpeed);)

 }

}

Но, ΠΊΠ°ΠΊ это Π½ΠΈ ΠΏΠ΅Ρ‡Π°Π»ΡŒΠ½ΠΎ, компилятор сообщит Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎ класс Garage Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ GetEnumerator(). Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ интСрфСйсом IEnumerable, находящимся Π² "Π½Π΅Π΄Ρ€Π°Ρ…" пространства ΠΈΠΌΠ΅Π½ System.Collections. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ повСдСния, Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΠΊΡ€Ρ‹Ρ‚ΡŒ содСрТащиСся Π² Π½ΠΈΡ… элСмСнты Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ сторонС.

// Π­Ρ‚ΠΎΡ‚ интСрфСйс ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ сторону ΠΎ Ρ‚ΠΎΠΌ,

// Ρ‡Ρ‚ΠΎ элСмСнты ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° пСрСчислимы.

public interface IEnumerable {

 IEnumerator GetEnumerator();

}

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΌΠ΅Ρ‚ΠΎΠ΄ GetEnumerator() Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ссылку Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ интСрфСйс – интСрфСйс c ΠΈΠΌΠ΅Π½Π΅ΠΌ System.Collections.IEnumerator. Π­Ρ‚ΠΎΡ‚ интСрфСйс ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ инфраструктуру, которая позволяСт Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ сторонС Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ» ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌ, содСрТащимся Π² IEnumerable-совмСстимом ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅.

// Π­Ρ‚ΠΎΡ‚ интСрфСйс позволяСт Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ сторонС

// ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ элСмСнты ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°.

public interface IEnumerator {

 bool MoveNext(); // Π‘Π΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ Π½Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π²ΠΏΠ΅Ρ€Π΅Π΄.

 object Current { get;} // ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ (свойство Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния).

 void Reset(); // Π‘Π΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.

}

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… интСрфСйсов Ρ‚ΠΈΠΏΠΎΠΌ Garage, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΉΡ‚ΠΈ ΠΏΠΎ Π΄Π»ΠΈΠ½Π½ΠΎΠΌΡƒ ΠΏΡƒΡ‚ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ свои вСрсии GetEnumerator(), MoveNext(), Current ΠΈ Reset(), Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ простой ΠΏΡƒΡ‚ΡŒ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ‚ΠΈΠΏ System.Array, ΠΊΠ°ΠΊ ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹, ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² IEnumerable ΠΈ IEnumerator, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запрос ΠΊ System.Array, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅.

using System.Collections;

public class Garage: IEnumerable {

 // Π’ System.Array ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ рСализация IEnumerator!

 private Car[] carArray;

 public Cars() {

  carArray = new Car[4];

  carArray[0] = new Car("FeeFee", 200, 0);

  carArray[l] = new Car("Clunker", 90, 0);

  carArray[2] = new Car("Zippy, 30, 0);

  carArray[3] = new Car("Fjred", 30, 0);}