Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C#_Console.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
1.4 Mб
Скачать

Упражнение 3. Создание и использование индексатора.

В этом упражнении Вы добавите индексатор для класса BankAccount для осуществления доступа к любому из объектов BankTransaction, кэшируемых во внутреннем массиве.

Транзакции, производимые со счетом, доступны через очередь (System.Collection.Queue), которая содержится в объекте BankAccount.

Вы создадите индексатор для класса BankAccount, который будет извлекать транзакции в определенной точке очереди или возвращать значение null, если в указанной точке транзакций нет. Например:

myAcc.AccountTransactions[2]

возвратит транзакцию номер 2 (третью в очереди).

В этом задании вы воспользуетесь методом GetEnumerator класса System.Collection.Queue.

  • Для класса BankAccount объявите индексатор только для чтения

  • Откройте проект Bank.sln из папки install folder\Labs\Lab13\Exercise3\Starter\Bank.

  • В классе BankAccount объявите public индексатор, возвращающий значения типа BankTransaction и принимающий в один параметр index типа int:

public BankTransaction this[int index]

{

...

}

  • В тело индексатора добавьте get-аксессор с одной инструкцией:

return new BankTransaction(99);

Код индексатора должен выглядеть следующим образом:

public BankTransaction this[int index]

{

get { return new BankTransaction(99); }

}

На данном шаге необходимо только протестировать синтаксис индексатора. Позже, Вы определите индексатор нужным образом.

  • Сохраните и откомпилируйте проект. Исправьте ошибки, если это необходимо.

  • Создайте транзакции

  • Откройте проект TestHarness.sln из папки install folder\Labs\Lab13\Exercise3\Starter\TestHarness.

  • Создайте ссылку на компонент Bank, созданный в предыдущих лабораторных работах. Для этого:

  • Разверните проект TestHarness в Solution Explorer.

  • ПКМ ReferencesAdd Reference.

  • Нажмите на кнопку Browse и перейдите в папку install folder\Labs\Lab13\Exercise3\Starter\Bank\bin\debug.

  • Выделите Bank.dll, а затем нажмите на кнопку Open.

  • Нажмите OK.

  • Создайте несколько транзакций, добавив следующие инструкции в конец метод CreateAccount.Main:

for (int i = 0; i < 5; i++) {

acc1.Deposit(100);

acc1.Withdraw(50);

}

Write(acc1);

Транзакции создадутся при вызове методов Deposit и Withdraw.

  • Сохраните и откомпилируйте проект. Исправьте ошибки, если это необходимо.

Запустите проект и убедитесь в том, что информация о транзакциях отражается корректным образом.

  • Вызовите индексатор BankAccount

  • В настоящий момент последние насколько инструкций метода CreateAccount.Write выводят информацию о транзакциях, используя цикл foreach следующим образом:

Queue tranQueue = acc.Transactions( );

foreach (BankTransaction tran in tranQueue) {

Console.WriteLine("Date: {0}\tAmount: {1}", tran.When, tran.Amount);

}

  • Выведите информацию о транзакциях другим способом:

  • Замените цикл foreach циклом for, в котором будет инкрементироваться значение переменной counter типа int в диапазоне от нуля до значения, возвращаемого tranQueue.Count.

  • В теле цикла for вызовите индексатор BankAccount, объявленный ранее. В качестве индекса используйте counter и сохраняйте возвращаемое значение типа BankAccount в локальной переменной tran.

  • Выведите на экран информацию из переменной tran:

for (int counter = 0; counter < tranQueue.Count; counter++) {

BankTransaction tran = acc[counter];

Console.WriteLine("Date: {0}\tAmount: {1}", tran.When, tran.Amount);

}

  • Сохраните и откомпилируйте проект. Исправьте ошибки, если это необходимо.

  • Запустите проект.

На экран выведется информация о нескольких транзакциях со значением 99 (это временное тестовое значение), т.к. индексатор пока еще определен не полностью.

  • Завершите определение индексатора BankAccount

  • Вернитесь в проект Bank.sln из папки install folder\Labs\Lab13\Exercise3\Starter\Bank.

  • В классе BankAccount удалите из тела индексатора инструкцию

return new BankTransaction(99);

  • Транзакции BankAccount хранятся в private поле tranQueue типа System.Collection.Queue. У класса Queue нет индексатора, поэтому для доступа к нужному элементу, необходимо вручную производить итерации. Реализуется это следующим образом:

  • Объявите переменную типа IEnumerator и проинициализируйте ее, используя метод GetEnumerator для переменной tranQueue.

  • Производите итерации по очереди n раз, используя метод MoveNext для переменной IEnumerator для перехода к следующей единице очереди.

  • Верните значение BankTransaction, вычисленное для n-ой позиции..

Ваш код должен выглядеть следующим образом:

IEnumerator ie = tranQueue.GetEnumerator( );

for (int i = 0; i <= index; i++) {

ie.MoveNext( );

}

BankTransaction tran = (BankTransaction)ie.Current;

return tran;

  • Проверьте, чтобы значение параметра index типа int находилось в пределах от нуля до tranQueue.Count.

Сделайте эту проверку перед проведением итераций tranQueue.

  • Итоговый код индексатора должен выглядеть следующим образом:

public BankTransaction this[int index]

{

get

{

if (index < 0 || index >= tranQueue.Count)

return null;

IEnumerator ie = tranQueue.GetEnumerator( );

for (int i = 0; i <= index; i++) {

ie.MoveNext( );

}

BankTransaction tran = (BankTransaction)ie.Current;

return tran;

}

}

  • Сохраните и откомпилируйте проект. Исправьте ошибки, если это необходимо.

  • Вернитесь в проект TestHarness и запустите его.

Убедитесь в том, что все десять транзакций отобразились корректно.

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