Algoritmy a programování IV

Týden 5

Různá pravidla kontokorentu

Poslední funkce, kterou chcete přidat, umožňuje LineOfCreditAccount účtovat poplatek za překročení úvěrového limitu místo odmítnutí transakce.

Jednou z technik je definování virtuální funkce, ve které implementujete požadované chování. Třída BankAccount refaktoruje metodu MakeWithdrawal do dvou metod. Nová metoda provede zadanou akci, když výběr vezme zůstatek pod minimum. Existující MakeWithdrawal metoda má následující kód:


public void MakeWithdrawal(decimal amount, DateTime date, string note)
{
    if (amount <= 0)
    {
        throw new ArgumentOutOfRangeException(nameof(amount), "Amount of withdrawal must be positive");
    }
    if (Balance - amount < _minimumBalance)
    {
        throw new InvalidOperationException("Not sufficient funds for this withdrawal");
    }
    var withdrawal = new Transaction(-amount, date, note);
    _allTransactions.Add(withdrawal);
}

Nahraďte ho následujícím kódem:


public void MakeWithdrawal(decimal amount, DateTime date, string note)
{
    if (amount <= 0)
    {
        throw new ArgumentOutOfRangeException(nameof(amount), "Amount of withdrawal must be positive");
    }
    Transaction? overdraftTransaction = CheckWithdrawalLimit(Balance - amount < _minimumBalance);
    Transaction? withdrawal = new(-amount, date, note);
    _allTransactions.Add(withdrawal);
    if (overdraftTransaction != null)
        _allTransactions.Add(overdraftTransaction);
}protected virtual Transaction? CheckWithdrawalLimit(bool isOverdrawn)
{
    if (isOverdrawn)
    {
        throw new InvalidOperationException("Not sufficient funds for this withdrawal");
    }
    else
    {
        return default;
    }
}

Přidaná metoda je protected, což znamená, že ji lze volat pouze z odvozených tříd. Tato deklarace brání ostatním klientům v volání metody. Je to také virtual proto, aby odvozené třídy mohly změnit chování. Návratový typ je Transaction?. Poznámka ? označuje, že metoda může vrátit null. Přidejte do pole následující implementaci, která vyúčtuje LineOfCreditAccount poplatek při překročení limitu výběru:



    isOverdrawn
    ? new Transaction(-20, DateTime.Now, "Apply overdraft fee")
    : default;
" style="box-sizing: inherit; outline-color: inherit; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; font-size: 1em; direction: ltr; border: 0px; padding: 0px; line-height: 1.3571; display: block; position: relative;">protected override Transaction? CheckWithdrawalLimit(bool isOverdrawn) =>
    isOverdrawn
    ? new Transaction(-20, DateTime.Now, "Apply overdraft fee")
    : default;

Přepsání vrátí transakci s poplatky, když je účet překreslen. Pokud výběr nepřesáhl limit, metoda vrátí null transakci. To znamená, že se nic neplatí. Otestujte tyto změny přidáním následujícího kódu do metody Main ve Program třídě:


var lineOfCredit = new LineOfCreditAccount("line of credit", 0, 2000);
// How much is too much to borrow?
lineOfCredit.MakeWithdrawal(1000m, DateTime.Now, "Take out monthly advance");
lineOfCredit.MakeDeposit(50m, DateTime.Now, "Pay back small amount");
lineOfCredit.MakeWithdrawal(5000m, DateTime.Now, "Emergency funds for repairs");
lineOfCredit.MakeDeposit(150m, DateTime.Now, "Partial restoration on repairs");
lineOfCredit.PerformMonthEndTransactions();
Console.WriteLine(lineOfCredit.GetAccountHistory());

Spusťte program a zkontrolujte výsledky.

Souhrn

Pokud jste se zasekli, můžete se podívat na zdroj tohoto kurzu v našem úložišti GitHub.

Tento kurz ukázal mnoho technik používaných při programování Object-Oriented:

  • Abstrakci jste použili při definování tříd pro každý z různých typů účtů. Tyto třídy popisují chování tohoto typu účtu.
  • Při uchovávání mnoha podrobností private v každé třídě jste použili encapsulation.
  • Použili jste dědičnost , když jste k uložení kódu využili implementaci již vytvořenou BankAccount ve třídě.
  • Polymorfismus jste použili při vytváření virtual metod, které by odvozené třídy mohly přepsat, aby se vytvořilo specifické chování pro daný typ účtu.