2014-10-23 3 views
0
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace CodyGarrettEX3 
{ 
    public class Account 
    { 
     private long acctNumber; 
     protected double balance; 
     public Savings SavingsAccount; 
     public Checking CheckingAccount; 

     public Account() 
     { 
      this.acctNumber = 1234; 
      Savings SavingsAccount = new Savings(acctNumber); 
      Checking CheckingAccount = new Checking(acctNumber); 
     } 

     public Account(long newAcctNo) 
     { 
      this.acctNumber = newAcctNo; 
      Savings SavingsAccount = new Savings(newAcctNo); 
      Checking CheckingAccount = new Checking(newAcctNo); 
     } 

     //Members 
     public long AcctNo 
     { 
      get { return AcctNo; } 
      set { AcctNo = value; } 
     } 

     public double Balance 
     { 
      get { return balance; } 
      set { balance = value; } 
     } 

     public virtual double Withdrawal(double amount) 
     { 
      if ((balance - amount) < 0) 
      { 
       PolicyException insufficientFundsException = new PolicyException("Insufficient Funds To Complete This Transaction"); 
       throw insufficientFundsException; 
      } 

      return balance; 
     } 

     public double Deposit(double amount) 
     { 
      balance = balance + amount; 
      return balance; 
     } 

    } 
} 



using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace CodyGarrettEX3 
{ 
    public class Savings: Account 
    { 
     private double interestRate; 
     private double minBalance; 

     public Savings(long newAcctNumber):base(newAcctNumber) 
     { 
      balance = 0; 
      interestRate = 0; 
      minBalance = 0; 
     } 

     //Properties 
     public double InterestRate //This is a correctional to ensure that the interest rate is always stored as a decimal for math calculations 
     { 
      get { return interestRate; } 
      set 
      { 
       if (value > 0) 
       { 
        value = value/100; 
       } 
       interestRate = value; 
      } 
     } 

     public double MinBalance 
     { 
      get { return minBalance; } 
      set { minBalance = value; } 
     } 

     public override double Withdrawal(double amount) 
     { 
      if (minBalance > 0) 
      { 
       if (amount > (balance - minBalance)) 
       { 
        PolicyException minBalanceException = new PolicyException("Insufficient Funds to Complete This Transaction, Exceeds Account Balance and Minimum Balance of Account"); 
        throw minBalanceException; 
       } 
      } 
      else 
      { 
       if(amount > (balance - amount)) 
       { 
        PolicyException insufficientFundsException = new PolicyException("Insufficient Funds to Complete This Transaction, Exceeds Account Balance"); 
        throw insufficientFundsException; 
       } 
      } 
      return balance; 
     } 

    } 
} 

Основная проблема, как это может показаться, что при компиляции класса, который манипулирует мой родитель, который является классом счета является то, что я получаю очень странный цикл, который просто идет от Конструктора счетов в Savings Constructor, а затем вызывает переполнение стека.Строительство пробегает по созданию объекта

Это происходит после выполнения «Account BankAccount = новой учетной записи (9999)»; в моем классе тестирования программ.

Большое вам спасибо за помощь! Я действительно пытаюсь понять, в чем причина.

Кроме того, сторона примечания У меня есть конструктор, построенный таким образом из-за требования в задании, которое требует, чтобы переменная acctNumber передавалась в объект до его создания. Даже если объект не использует значение. Однако, если это невозможно, я открыт для чего-то действительно.

ответ

1

Петля не такая уж странная. В Сбережениях вы наследуете учетную запись. Конструктор Savings также вызывает конструктор Учетной записи.

Создатель учетной записи создает новый объект «Сбережения». Конструктор этого нового объекта сохранения хочет передать данные конструктору Учетных записей, который хочет создать новый объект «Сбережения». Ринс и повтори. Это будет продолжаться и продолжаться.

Похоже на запах кода, что базовый класс (Учетная запись) создает (и знает) наследующие классы (например, Экономия).

Edit: Я не знаю подробности ваших требований, но, как я смотрю на это дизайн не подходит для вашей проблемы.

У вас есть ваш банковский счет, и этот банковский счет может быть сберегательным счетом.

class Account 
{ 
    protected int _accNr; 

    public Account() 
    { 
     _accnr = 1234; 
    }  

    public Account(int accNr) 
    { 
     _accNr = accNr; 
     // only do basic 'account' stuff 
    } 
} 

class Savings : Account 
{ 
    public Savings() : base() 
    { 
     // do other stuff 
    } 

    public Savings(int accNr) : base(accNr) 
    { 
     // do other stuff 
    } 
} 

Теперь я только создал конструкторы и ничего больше. Точка, что теперь вы можете либо создать класс сбережения, или, без счетов Н.Р. по телефону:

Account a = new Savings(); 

или

Account b = new Savings(9999); 

Теперь ОБЯЗАННОСТИ разделены между аккаунтом и сберегательными классами. Класс Account не хочет знать о наследовании классов и их обязанностях. Через полиморфизм мы можем создавать учетные записи типа «Сбережения», но вы также можете игнорировать это и делать Savings a = new Savings(9999).

+0

Как конструктор сбережений проходит этот процесс, если он должен быть дочерним классом? Я понимаю, к чему вы клоните, но я не совсем в состоянии концептуально забить это. –

+0

Я отредактировал ответ. Имеет ли это смысл? – Adimeus

Смежные вопросы