Homework - Принципи на ООП - част II


2

Ето го моето домашно за втората част от принципите на ООП.


в C# OOP от wnvko (3123 точки)


Отговори



1
Ето и моето ЦЪК (Exceptiona съм го написал, но просто не ми остана време да го кача в GitHub - ще го ъпдейтна и него довечера : ) )

от tabula (2134 точки)


0

OOP Principles - Part II: Това е моето домашно.

Използвах само един интерфейс - ICalculable, за изчисляване на лихвата, тьй като се прилага от всички класове на банкови сметки.

Тегленето и внасянето на пари изпълних с помощта на методи:

- за теглене - метод в класа на депозитните сметки (само от тях могат да се твглят пари);

- за внасяне - виртуален метод в абстрактния клас на банковите сметки, като се override-ва където е необходимо.


от ellapt (6303 точки)


1

Когато баланса в Loan акаунт е 3000$ примерно и някой реши да внесе поредната вноска то според този код баланса ще нарастне. В други домащни слагаха баланса за Mortgage и Loan отрицателен, но ти хвърляш exception в този случай. Това мисля че трябва да го оправиш.

А за интерфейса не мисля че ти е нужен този интерфейс. Аз импрелентирам интерфейси в класове с цел да покажа разликата им от други класове. Например класа ми DepositAcc имплементира IDrawable защотото само той може да тегли.

Всъщност интерфейса ти ICalculable си е точно на място но при положение, че имаш клас и за дебитни карти.



0

@anarhist_hristov, много ти благодаря за съвета! Проясни ми се въпросът къде да използвам и къде - не интерфейси.

Коригирах , като добавих интерфейс IDrawable и зададох само класът DepositAccount да имплементира този интерфейс, както е по условие. Така от останалите сметки няма да може да се теглят пари.

Тогава би трябвало да няма интерфейс ICalculable и просто да го изтрия, като оставя виртуалния метод CalculateInterest и неговите override-вания, които наистина в случая са направени за всички банкови сметки. Направих този опит (само изтрих спецификацията му в BankAccount) и се получи.

В крайния вариант обаче оставих ICalculable, както се казва, for future use - при бъдещо разширение за дебитни карти.


от ellapt (6303 точки)


0

Да му се не види!

'Bank_accounts.AccountTypes.DepositAccount' does not implement interface member 'Bank_accounts.IDepositable.Deposit()'. 'Bank_accounts.AccountTypes.DepositAccount.Deposit()' cannot implement an interface member because it is not public.

Какво иска от мен?

В проекта имам: 

namespace Bank_accounts
{
    public interface IDepositable
    {
        void Deposit();
    }
}

======================

И в папка AccountTypes - 3-те вида сметки. Ето я депозитната:

namespace Bank_accounts.AccountTypes
{
    public class DepositAccount : Account, IDepositable
    {
        void Deposit()
        {

        }
    }
}

===================

Account.cs:

namespace Bank_accounts
{
    public class Account
    {
        private Customer customer;
        private decimal balance;
        private decimal interestRate;
    }
}

Досега не бях ползвал папки, да си организирам файловете. Опитах да копирам namespace-a Bank_accounts.AccountTypes в Account.cs, в Main, къде ли не, как ли не. Ама не става.

Както го разбирам аз - всеки файл в подnamespace бива скрит от горния namespace и ако искам да го ползам в горния някъде, в някой си файл, трябва да го напиша. Ама...



от Bruno (921 точки)


2
namespace Bank_accounts.AccountTypes
{
    public class DepositAccount : Account, IDepositable
    {
        public void Deposit() // Опитай така, по принцип като не му задаваш access modifier, компилатора го слага private, а всичко идващо от интерфейс трябва да е public
        {

        }
    }
}

от cecunqk (70 точки)

0

И това бях опитал, но казва:
The modifier 'public' is not valid for this item

Рестартирах и студиото, за всеки случай.


от Bruno (921 точки)



1

Това е и от мен homework :)


от c.l.angelov (510 точки)