“对象”不包含“名称”的定义

时间:2012-10-30 11:52:03

标签: c# inheritance polymorphism

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

'BankAccount.account'不包含'withdraw'的定义。

这是我的代码:

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

}

我不明白为什么它不承认它。它是类saveaccount中的一种方法。

6 个答案:

答案 0 :(得分:6)

你正在打电话

base.withdraw(amt);

来自您的班级savingsaccount。但是基类(account)没有这样的方法。所以编译器绝对正确。

答案 1 :(得分:4)

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

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

注意我将“存款”更改为+=,并创建方法virtual,以便子类可以override方法,这是(我强烈怀疑)这里的意图。此外,float是存钱的绝佳选择。 decimal可能是更好的选择。作为一种风格上的变化,我也把这些名字大写了。

答案 2 :(得分:1)

我假设您的目的是在基础withdraw类中定义基本的account方法,以便savingaccountcurrentaccount继承它。您应该将其声明为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++;
        }
    }
}

答案 3 :(得分:0)

您在base.withdraw(amt)班级中呼叫savingaccount,但基类account未定义此方法。

答案 4 :(得分:0)

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

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

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

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

您的代码也存在命名样式问题,但这可能不在此问题的范围内:)

答案 5 :(得分:0)

正如大家都指出的那样,你应该在你的基类acocunt上声明withdraw()方法,这样所有派生类都可以继承这个方法。