Читаем Язык программирования C#9 и платформа .NET5 полностью

К настоящему моменту вы видели, как расширять классы (и косвенно структуры, которые следуют тому же синтаксису) новой функциональностью через расширяющие методы. Также есть возможность определить расширяющий метод, который способен расширять только класс или структуру, реализующую корректный интерфейс. Например, можно было бы заявить следующее: если класс или структура реализует интерфейс IEnumerable, тогда этот тип получит новые члены. Разумеется, вполне допустимо требовать, чтобы тип поддерживал вообще любой интерфейс, включая ваши специальные интерфейсы.

В качестве примера создайте новый проект консольного приложения по имени InterfaceExtensions. Цель здесь заключается в том, чтобы добавить новый метод к любому типу, который реализует интерфейс IEnumerable, что охватывает все массивы и многие классы необобщенных коллекций (вспомните из главы 10, что обобщенный интерфейс IEnumerable расширяет необобщенный интерфейс IEnumerable). Добавьте к проекту следующий расширяющий класс:


using System;

namespace InterfaceExtensions

{

  static class AnnoyingExtensions

  {

    public static void PrintDataAndBeep(

      this System.Collections.IEnumerable iterator)

    {

      foreach (var item in iterator)

      {

        Console.WriteLine(item);

        Console.Beep;

      }

    }

  }

}


Поскольку метод PrintDataAndBeep может использоваться любым классом или структурой, реализующей интерфейс IEnumerable, мы можем протестировать его с помощью такого кода:


using System;

using System.Collections.Generic;

using InterfaceExtensions;


Console.WriteLine("***** Extending Interface Compatible Types *****\n");


// System.Array реализует IEnumerable!

string[] data =

  { "Wow", "this", "is", "sort", "of", "annoying",

    "but", "in", "a", "weird", "way", "fun!"};

data.PrintDataAndBeep;


Console.WriteLine;


// List реализует IEnumerable!

List myInts = new List {10, 15, 20};

myInts.PrintDataAndBeep;


Console.ReadLine;


На этом исследование расширяющих методов C# завершено. Помните, что данное языковое средство полезно, когда необходимо расширить функциональность типа, но вы не хотите создавать подклассы (или не можете, если тип запечатан) в целях обеспечения полиморфизма. Как вы увидите позже, расширяющие методы играют ключевую роль в API-интерфейсах LINQ. На самом деле вы узнаете, что в API-интерфейсах LINQ одним из самых часто расширяемых элементов является класс или структура, реализующая обобщенную версию интерфейса IEnumerable.

Поддержка расширяющего метода GetEnumerator (нововведение в версии 9.0)

До выхода версии C# 9.0 для применения оператора foreach с экземплярами класса в этом классе нужно было напрямую определять метод GetEnumerator. Начиная с версии C# 9.0, оператор foreach исследует расширяющие методы класса и в случае, если обнаруживает метод GetEnumerator, то использует его для получения реализации IEnumerator, относящейся к данному классу. Чтобы удостовериться в сказанном, добавьте новый проект консольного приложения по имени ForEachWithExtensionMethods и поместите в него упрощенные версии классов Car и Garage из главы 8:


// Car.cs

using System;


namespace ForEachWithExtensionMethods

{

  class Car

  {

    // Свойства класса Car.

    public int CurrentSpeed {get; set;} = 0;

    public string PetName {get; set;} = "";


    // Конструкторы.

    public Car {}

    public Car(string name, int speed)

    {

      CurrentSpeed = speed;

      PetName = name;

    }


    // Выяснить, не перегрелся ли двигатель Car.

  }

}


// Garage.cs

namespace ForEachWithExtensionMethods

{

  class Garage

  {

    public Car[] CarsInGarage { get; set; }


    // При запуске заполнить несколькими объектами Car.

    public Garage

    {

      CarsInGarage = new Car[4];

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

Перейти на страницу:

Похожие книги

Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT