构建循环通过对象创建

时间:2014-10-23 08:39:09

标签: c# class multiple-constructors

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;
        }

    }
}

看起来主要的问题是,在编译操作我的父类的类时,这是一个帐户类是我得到一个非常奇怪的循环,它从Account构造器快速转到Savings Constructor然后导致堆栈溢出。

这是在执行&#34; Account BankAccount = new Account(9999);&#34;在我的程序测试课程中。

非常感谢大家的帮助!我真的很难弄清楚这里的原因是什么。

另外,请注意我有这样构造的构造函数,因为在赋值中要求我们必须将acctNumber变量传递给对象才能创建它。即使对象没有使用该值。但是,如果这是不可能的,我会对任何事情持开放态度。

1 个答案:

答案 0 :(得分:1)

循环不是那么奇怪。 在Savings中,您继承自Account。 Savings的构造函数也调用Account的构造函数。

Account的构造函数创建一个新的“Savings”对象。这个新的储蓄对象的构造函数想要将数据传递给Accounts的构造函数,该构造函数想要创建一个新的Savings对象。 Rince并重复一遍。这将继续下去。

看起来像基类(Account)创建(并且知道)继承类(如Savings)的代码气味。

修改: 我不知道您的要求的详细信息,但正如我在看这个设计不适合您的问题。

您已拥有银行帐户,此银行帐户可以是储蓄式帐户。

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
   }
}

现在,我只设置了构造函数而没有其他任何东西。要点是,现在您可以通过调用:

创建一个Savings类,或者没有帐户nr
Account a = new Savings();

Account b = new Savings(9999);

现在,责任分配在帐户和储蓄类之间。 Account类不想知道继承类及其职责。通过多态,我们可以创建“储蓄”类型的帐户,但您也可以忽略它并执行Savings a = new Savings(9999)