Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
opi.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.81 Mб
Скачать

Застосування методів розширення до інтерфейсу

Можна створити також методи розширення, які застосовуються до інтерфейсу, що дозволяє викликати метод розширення для всіх класів, що реалізують інтерфейс. У лістингу 4 показаний клас ShoppingCart, оновлений з метою реалізації інтерфейсу IEnumerable <Product>.

Лістинг 4. Реалізація інтерфейсу в класі ShoppingCart

using System.Collections;

using System.Collections.Generic;

public class ShoppingCart : IEnumerable<Product> {

public List<Product> Products { get; set; }

public IEnumerator<Product> GetEnumerator() {

return Products.GetEnumerator();

}

IEnumerator IEnumerable.GetEnumerator() {

return GetEnumerator();

}

}

Тепер наш метод розширення можна оновити так, щоб він працював з інтерфейсом IEnumerable <Product> (див. лістинг 5).

Лістинг 5. Метод розширення, який працює з інтерфейсом

using System.Collections.Generic;

public static class MyExtensionMethods {

public static decimal TotalPrices(this IEnumerable<Product> productEnum) {

decimal total = 0;

foreach (Product prod in productEnum) {

total += prod.Price;

}

return total;

}

}

Тип першого параметра був змінений на IEnumerable <Product>, а це означає, що цикл foreach в тілі методу працює безпосередньо з об'єктом параметра. В іншому метод розширення залишився незміненим. Перехід до інтерфейсу означає, що ми можемо обчислити загальну вартість об'єктів Products, перерахованих будь-яким інтерфейсом IEnumerable <Product>, який включає в себе як екземпляри колекції ShoppingCart, так і масиви об'єктів Products (див. лістинг 6).

Лістинг 6. Застосування методу розширення до різних реалізацій одного інтерфейсу

using System;

using System.Collections.Generic;

class Program {

static void Main(string[] args) {

// create and populate ShoppingCart

IEnumerable<Product> products = new ShoppingCart {

Products = new List<Product> {

new Product {Name = "Kayak", Category = "Watersports", Price = 275M},

new Product {Name = "Lifejacket", Category = "Watersports", Price = 48.95M},

new Product {Name = "Soccer ball", Category = "Soccer", Price = 19.50M},

new Product {Name = "Corner flag", Category = "Soccer", Price = 34.95M}

}

};

// create and populate an array of Product objects

Product[] productArray = {

new Product {Name = "Kayak", Price = 275M},

new Product {Name = "Lifejacket", Price = 48.95M},

new Product {Name = "Soccer ball", Price = 19.50M},

new Product {Name = "Corner flag", Price = 34.95M}

};

// get the total value of the products in the cart

decimal cartTotal = products.TotalPrices();

// decimal arrayTotal = products.TotalPrices();

decimal arrayTotal = productArray.TotalPrices();

Console.WriteLine("Cart Total: {0:c}", cartTotal);

Console.WriteLine("Array Total: {0:c}", arrayTotal);

}

}

На замітку! Спосіб реалізації інтерфейсу IEnumerable<T> масивами C# дещо незвичний. Його НЕ вдасться знайти у списку реалізованих інтерфейсів у документації MSDN. Підтримка здійснюється компілятором, тому код, написаний для більш ранніх версій С#, також буде компілюватися. У цьому прикладі можна було б скористатися іншим узагальненим класом колекції, але приклад демонструє нюанси специфікації С #.

Якщо скомпілювати і запустити клас, наведений у лістингу 6, ви отримаєте наступні результати, які демонструють, що метод розширення повертає один і той же результат, незалежно від способу відбору об'єктів Product:

Cart Total: $ 378.40

Array Total: $ 378.40

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]