Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:使用Windows窗体的ATM系统如何安装取款按钮?这笔钱扣了两次_C#_Button_Polymorphism_Abstract Class_Windows Forms Designer - Fatal编程技术网

C#:使用Windows窗体的ATM系统如何安装取款按钮?这笔钱扣了两次

C#:使用Windows窗体的ATM系统如何安装取款按钮?这笔钱扣了两次,c#,button,polymorphism,abstract-class,windows-forms-designer,C#,Button,Polymorphism,Abstract Class,Windows Forms Designer,例如:当我的余额为200美元时,我第一次提取12美元,剩余的是188美元(这是有效的),但当我再次提取2美元时(必须是186美元),但我得到的答案是174美元。 我在项目中使用了多态性和抽象类。我对它进行了调试,发现我创建的foreach语句就是问题所在,但我无法修复它。 我忘了放数据库类 public class BankDatabase { private Account[] account; public BankDatabase() { accou

例如:当我的余额为200美元时,我第一次提取12美元,剩余的是188美元(这是有效的),但当我再次提取2美元时(必须是186美元),但我得到的答案是174美元。 我在项目中使用了多态性和抽象类。我对它进行了调试,发现我创建的foreach语句就是问题所在,但我无法修复它。 我忘了放数据库类

public class BankDatabase
{
    private Account[] account;
    public BankDatabase()
    {
        account = new Account[3];
        account[0] = new Account(1000, 1111, 200, 100);
        account[1] = new Account(1001, 2222, 400, 500);
        account[2] = new Account(1002, 3333, 100, 700);
    }
    private Account GetAccount(int account_number)
    {
        foreach (Account currentAccount in account)
        {
            if (currentAccount.AccountNum == account_number)
                return currentAccount;
        }
        return null;
    }
    public bool Validation(int user_accnum, int user_pin)
    {
        Account user = GetAccount(user_accnum);
        if (user != null)
            return user.verification(user_pin);
        else
            return false;
    }
    public decimal GetAvailableBalance(int user_accum)
    {
        Account user = GetAccount(user_accum);
        return user.AvailableBalance;
    }
    public decimal GetTotalBalance(int user_accum)
    {
        Account user = GetAccount(user_accum);
        return user.TotalBalance;
    }
    public decimal Credit(int user_accum, decimal amount)
    {
        Account user = GetAccount(user_accum);
        return user.Credit(amount);
    }
    public decimal Debit(int user_accum, decimal amount)
    {
        Account user = GetAccount(user_accum);
        return user.debit(amount);
    }
}  


class Account
{
    private  int accountnum;
    private int pin;
    private decimal availablebalance;
    private  decimal totalbalance;

    public Account()
    {

    }
    public Account(int accountnum, int pin, decimal availablebalance, decimal totalbalance)
    {

        this.accountnum = accountnum;
        this.pin = pin;
        this.availablebalance = availablebalance;
        this.totalbalance = totalbalance;
    }
    public int  AccountNum
    {
        get
        {
            return accountnum;
        }
    }
    public int PIN
    {
        get
        {
            return pin;
        }
    }
    public decimal AvailableBalance
    {
        get
        {
            return availablebalance;
        }
    }
    public decimal TotalBalance
    {
        get
        {
            return totalbalance;
        }
    }

    public decimal Credit(decimal amount)
    {
        return availablebalance = availablebalance + amount;
    }

    public decimal debit(decimal amount)
    {
        return availablebalance = availablebalance - amount;
    }

    public bool verification (int userpin)
    {
        return (userpin == PIN);
    }
}

public class Withdraw : Transaction
{
    private decimal amount;
    decimal t2;
    public Withdraw()
    { }
    public Withdraw(int accountnum, BankDatabase database, decimal amount) : base(accountnum, database)
    {
        this.amount = amount;
    }
    public decimal Amount
    {
        get
        {
            return amount;
        }
    }
    public override string ToString()
    {
        return "Withdrawn amount is= " + t2;
    }
    public override decimal balance()
    {
        decimal availablebalance = DataBase.GetAvailableBalance(accountnum);
        if(amount<=availablebalance)
        {
            t2 = DataBase.Debit(accountnum, amount);

        }
        return t2;
    }       
}


public abstract class Transaction
{
    protected int accountnum;
    private BankDatabase database;
    public Transaction ()
    {

    }
    public Transaction(int accountnum,BankDatabase database)
    {
        this.accountnum = accountnum;
        this.database = database;
    }
    public int AccountNum
    {
        get
        {
            return accountnum;
        }
    }
    public BankDatabase DataBase
    {
        get
        {
            return database;
        }
    }
    public abstract decimal balance();
    public override string ToString()
    {
        return "Account Number" + accountnum;
    }
}

private void withdraw_button_Click(object sender, EventArgs e)
    {
        transaction.Add(new Withdraw(Form1.accountnumber, database, with_amount));
        foreach (Transaction trans in transaction)       
        {     
            label2.Text = "Withdraw" + trans.balance().ToString();
        }
    }
公共类数据库
{
私人账户[]账户;
公共银行数据库()
{
账户=新账户[3];
账户[0]=新账户(10001111200100);
账户[1]=新账户(1001222400500);
账户[2]=新账户(1002333100700);
}
私人帐户GetAccount(内部帐户\u编号)
{
foreach(账户中的当前账户)
{
if(currentAccount.AccountNum==帐号)
返回活期账户;
}
返回null;
}
公共bool验证(int user\u accnum、int user\u pin)
{
账户用户=GetAccount(用户\账户编号);
如果(用户!=null)
返回用户验证(用户密码);
其他的
返回false;
}
公共十进制GetAvailableBalance(int user_accum)
{
账户用户=GetAccount(用户累计);
返回user.AvailableBalance;
}
公共十进制GetTotalBalance(int user_acum)
{
账户用户=GetAccount(用户累计);
返回user.TotalBalance;
}
公共十进制贷记(整数用户累计,十进制金额)
{
账户用户=GetAccount(用户累计);
返回用户信用(金额);
}
公共十进制借方(整数用户累计,十进制金额)
{
账户用户=GetAccount(用户累计);
返回用户。借方(金额);
}
}  
类别帐户
{
私人帐户数;
私人密码;
私有十进制可用平衡;
私人十进位余额;
公共帐户()
{
}
公共帐户(int accountnum、int pin、十进制可用余额、十进制总余额)
{
this.accountnum=accountnum;
this.pin=pin;
this.availablebalance=availablebalance;
this.totalbalance=totalbalance;
}
公共int AccountNum
{
得到
{
返回accountnum;
}
}
公共内部PIN码
{
得到
{
回位销;
}
}
公共十进制可用平衡
{
得到
{
返回可用平衡;
}
}
公共十进制总余额
{
得到
{
返回总余额;
}
}
公共十进制信用证(十进制金额)
{
返回可用平衡=可用平衡+金额;
}
公共十进制借方(十进制金额)
{
return availablebalance=availablebalance-金额;
}
公共bool验证(int-userpin)
{
返回(userpin==PIN);
}
}
公共类撤消:事务
{
私人十进制金额;
十进制t2;
公众撤回
{ }
公共提款(int accountnum,BankDatabase数据库,十进制金额):基数(accountnum,数据库)
{
这个。金额=金额;
}
公共小数金额
{
得到
{
退货金额;
}
}
公共重写字符串ToString()
{
return“提取金额为=”+t2;
}
公共覆盖十进制余额()
{
decimal availablebalance=数据库.GetAvailableBalance(accountnum);

如果(金额在您的foreach循环中,您正在迭代您的交易,而没有为下一个循环清除它。实际上,您正在累积交易,并每次重复它们。以某种方式清除
交易
可以解决您的问题。

您可能没有清除交易,而您的foreach循环正在重复它。还没有完全查看代码,但是如果您在方法末尾清除了事务,您应该会很好。Retrach\u Click事件处理程序中事务变量的数据类型是什么?这是一个
列表吗?
?您在哪里定义它?您向我们展示了很多代码,但可能没有展示最重要的代码partI会说,使用draw.Balance()来应用更改似乎是一个奇怪的地方。我希望交易有一个虚拟的apply()或类似的。并且帐户有一个贷方(借方只是一个负值)取款将依赖于账户来实际进行更改。余额似乎不是取款的“一部分”。@gilliduck我确实使用了clear事务,它工作正常!谢谢!现在我想在账户之间转账,不使用真正的数据库而不是数据库类,这可能吗?