Студопедия
Случайная страница | ТОМ-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; просмотров: 136 | Нарушение авторских прав


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

mybiblioteka.su - 2015-2019 год. (0.008 сек.)