Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Обобщенные методы

Читайте также:
  1. I. Экспертные оценочные методы
  2. II. Категории и методы политологии.
  3. IV. Биогенетические методы, способствующие увеличению продолжительности жизни
  4. V2: МЕТОДЫ ГИСТОЛОГИЧЕСКИХ ИССЛЕДОВАНИЙ
  5. V2: Цитология и методы цитологии
  6. АВАРИИ В БУРЕНИИ, ИХ ПРЕДУПРЕЖДЕНИЕ И МЕТОДЫ ЛИКВИДАЦИИ
  7. Административные и экономические методы регулирования внешней торговли на национальном уровне.

В дополнение к обобщенным классам можно также определять обобщенные методы. В объявлении обобщенного метода присутствует обобщенный тип.

Метод Swap<T> определяет Т как обобщенный тип, который используется для двух аргументов и переменной temp:

 

void Swap<T>(ref T х, ref Т у)

{

Т temp;

temp = х;

х = у;

у = temp;

}

 

Обобщенный метод может быть вызван с указанием конкретного типа вместо обобщенного:

 

int i = 4;

int j = 5;

Swap<int>(ref i, ref j);

 

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

 

int i = 4;

int j = 5;

Swap(ref i, ref j);

 

Ниже приведен пример применения обобщенного метода для накопления всех элементов коллекции. Для того чтобы продемонстрировать возможности обобщенных методов, используем класс Account, включающий свойства Name и Balance:

public class Account

{

private string name;

private decimal balance;

public string Name

{

get { return name; }

}

public decimal Balance

{

get { return balance; }

}

public Account(string name, decimal balance)

{

this.name = name;

this.balance = balance;

}

}

 

Все счета, чей баланс нужно аккумулировать, добавляются в список счетов типа List<Account>:

 

List<Account> acounts = new List<Account>();

acounts.Add(new Account("Карасев Станислав ", 100000));

acounts.Add(new Account("Орлова Капитолина ", 150000));

acounts.Add(new Account("Скляной Дмитрий ", 200000));

acounts.Add(new Account("Афаносьев Яков ", 500000));

acounts.Add(new Account("Сурмалян Мелина ", 900000));

 

Традиционный способ накопления всех объектов Account заключается в применении цикла foreach для прохода по всем объектам Account, как показано ниже. Поскольку оператор foreach требует интерфейса IEnumerable для выполнения итерации по элементам коллекции, аргумент метода
AccumulateSimple() имеет тип IEnumerable. Таким образом, метод
AccumulateSimple() может быть использован со всеми классами коллекций, которые реализуют интерфейс IEnumerable.

В реализации этого метода выполняется прямое обращение к свойству Balance класса Account:

 

public static class Algorithm

{

public static decimal AccumulateSimple(IEnumerable e)

{

decimal sum = 0;

foreach (Account a in e)

{

sum += a.Balance;

}

return sum;

}

}

 

Метод AccumulateSimple вызывается следующим образом:

 

decimal amount = Algorithm.AccumulateSimple(acounts);

 

Полный код метода приведен ниже, а результаты выполенения на рис.7.8.

 

class Program

{

static void Main(string[] args)

{

List<Account> acounts = new List<Account>();

acounts.Add(new Account("Карасев Станислав ", 100000));

acounts.Add(new Account("Орлова Капитолина ", 150000));

acounts.Add(new Account("Скляной Дмитрий ", 200000));

acounts.Add(new Account("Афаносьев Яков ", 500000));

acounts.Add(new Account("Сурмалян Мелина ", 900000));

foreach (Account a in acounts)

Console.WriteLine("Клиент: {0} Баланс счета: {1}", a.Name, a.Balance);

decimal amount = Algorithm.AccumulateSimple(acounts);

Console.WriteLine("\n\nБаланс {1} счетов: {0}", amount, acounts.Count.ToString());

string s = Console.ReadLine();

}

}

 

Рис. 7.8. Результаты работы программы

Проблема первой реализации связана с тем, что она работает только с объектами Account. Этого можно избежать, применив обобщенный метод.

Вторая версия Accumulate() принимает только тип, реализующий интерфейс IAccount:

 

public interface IAccount

{

string Name

{

get;

}

decimal Balance

{

get;

}

}

 

В рассматриваетом нами примере класс Account должен поддерживать интерфейс IAccount.

 

public class Account: IAccount

 

Как мы уже видели в случае обобщенных классов, обобщенный тип может быть ограничен с помощью конструкции where. To же ограничение, которое используется с обобщенными классами, может быть применено и к обобщенным методам. Изменим параметр метода Accumulate() на
IEnumerable<T>. IEnumerable<T> - это обобщенная версия интерфейса
IEnumerable, которая реализована обобщенными классами коллекций:

 


Дата добавления: 2015-07-07; просмотров: 146 | Нарушение авторских прав


Читайте в этой же книге: Повторное использование двоичного кода | Обзор обобщенных коллекций | Поиск элементов | Сортировка | Преобразования типов |
<== предыдущая страница | следующая страница ==>
Создание пользовательских обобщенных классов| Обобщенные делегаты

mybiblioteka.su - 2015-2024 год. (0.01 сек.)