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变量传递给对象才能创建它。即使对象没有使用该值。但是,如果这是不可能的,我会对任何事情持开放态度。
答案 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类,或者没有帐户nrAccount a = new Savings();
或
Account b = new Savings(9999);
现在,责任分配在帐户和储蓄类之间。 Account类不想知道继承类及其职责。通过多态,我们可以创建“储蓄”类型的帐户,但您也可以忽略它并执行Savings a = new Savings(9999)
。