0

我收到一条错误消息,告诉我:

“BankAccount.account”不包含“提款”的定义。

这是我的代码:

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

namespace BankAccounts
{
class account
{
    protected string name;
    protected float balance;
    public account(string n, float b)
    {
        name = n;
        balance = b;
    }

    public void deposit(float amt)
    {
        balance -= amt;
    }

    public void display()
    {
        Console.WriteLine("Name: {0}. Balance: {1}.", name, balance);
    }
}

class savingaccount : account
{
    static int accno = 1000;
    int trans;
    public savingaccount(string s, float b) : base(s, b)
    {
        trans = 0;
        accno++;
    }
    public void withdraw (float amt)
    {
        if (trans >= 10)
        {
            Console.WriteLine("Number of transactions exceed 10.");
            return;
        }
        if (balance - amt < 500)
            Console.WriteLine("Below minimum balance.");
        else
        {
            base.withdraw(amt);
            trans++;
        }
    }
    public void deposit(float amt)
    {
        if (trans >= 10)
        {
            Console.WriteLine("Number of transactions exceed 10.");
            return;
        }
        base.deposit(amt);
        trans++;
    }
    public void display()
    {
        Console.WriteLine("Name: {0}. Account no.: {1}. Balance: {2}", name, accno,        balance);
    }
}

class currentaccount : account
{
    static int accno = 1000;
    public currentaccount(string s, float b) : base(s, b)
    {
        accno++;
    }
    public void withdraw(float amt)
    {
        if (balance - amt < 0)
            Console.WriteLine("No balance in account.");
        else
            balance -= amt;
    }
    public void display()
    {
        Console.WriteLine("Name: {0}. Account no.: {1}. Balance: {2}.", name, accno, balance);
    }
}

}

我不明白为什么它不识别它。它是类 Savingaccount 中的一个方法。

4

6 回答 6

6

你在打电话

base.withdraw(amt);

从你的课savingsaccount上。但是基类 ( account) 没有这样的方法。所以编译器是绝对正确的。

于 2012-10-30T11:55:42.077 回答
4

看起来您只是错过了基本类型的方法:

public virtual void Deposit(float amt)
{
    balance += amt;
}
public virtual void Withdraw(float amt)
{
    balance -= amt;
}

请注意,我将“存款”更改为+=,并创建了该方法virtual,以便子类可以override使用该方法,这就是(我强烈怀疑)这里的意图。此外,float对于存钱来说,这是一个非常糟糕的选择。decimal可能是更好的选择。作为风格上的改变,我还将名字大写。

于 2012-10-30T12:01:52.497 回答
1

我假设您的意图是withdraw在基account类中定义基本方法,以便它可以同时被savingaccount和继承currentaccount。如果需要,您应该将其声明为virtual允许它被派生类覆盖。

class account
{
    public virtual void withdraw(float amt)
    {
        if (balance - amt < 0)
            Console.WriteLine("No balance in account.");
        else
            balance -= amt;
    }
}

该类currentaccount大概不需要修改这个继承方法的逻辑,所以可以完全省略。另一方面,在您的savingaccount类中,您可以重写该方法来实现您的自定义行为:

class savingaccount : account
{
    public override void withdraw(float amt)
    {
        if (trans >= 10)
        {
            Console.WriteLine("Number of transactions exceed 10.");
            return;
        }
        if (balance - amt < 500)
            Console.WriteLine("Below minimum balance.");
        else
        {
            base.withdraw(amt);
            trans++;
        }
    }
}
于 2012-10-30T12:00:07.880 回答
0

正如大家已经指出的那样,您应该在您的基类帐户上声明withdraw() 方法,以便所有派生类都可以继承该方法。

于 2012-10-30T12:36:44.353 回答
0

base.withdraw(amt)在你的savingaccount类中调用,但是基类account没有定义这个方法。

于 2012-10-30T11:56:00.267 回答
0

如果你仔细观察,你会发现你的account类实际上没有withdraw方法。

我猜你的意思是让你的account类包含一个虚拟方法withdraw,定义如下: public virtual void withdraw(float amt) { ... }

然后,在您继承的类中,您希望重写此方法,如下所示:

class currentaccount : account
{
    public override void withdraw(float amt)
    {
        ...
        base.withdraw(amt)
        ...
    }
    ...
}

您的代码还有一个命名样式问题,但这可能不在这个问题的范围内:)

于 2012-10-30T11:58:41.907 回答