我收到一条错误消息告诉我:
'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中的一种方法。
答案 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
方法,以便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++;
}
}
}
答案 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()方法,这样所有派生类都可以继承这个方法。