“对象”不包含“名称”的定义
我收到的错误消息告诉我:“对象”不包含“名称”的定义
'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);
}
}
}
我不明白为什么它不承认它。它是类savingaccount中的一个方法。
你从你的savingsaccount
类调用
base.withdraw(amt);
。但基类(account
)没有这样的方法。所以编译器是绝对正确的。
您在savingaccount
类中调用base.withdraw(amt)
,但基类account
未定义此方法。
如果仔细观察,您会发现account
类实际上没有withdraw
方法。
我猜你的意思是让你的account
类包含一个虚方法withdraw
,这样的定义: public virtual void withdraw(float amt) { ... }
然后,在你的继承类,你会想覆盖此方法,像这样:
class currentaccount : account
{
public override void withdraw(float amt)
{
...
base.withdraw(amt)
...
}
...
}
还有一个命名风格问题与您的代码,但是这可能不是在这个问题:)
如果'account.withdraw'是'abstract',那么'base.withdraw()'也不起作用。 – Joey
对。我会解决它。 – MisterMetaphor
的范围我一个ssume你的意图是在基类account
类中定义基本的withdraw
方法,这样它将被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++;
}
}
}
看起来你只是错过了从基本型的方法:
public virtual void Deposit(float amt)
{
balance += amt;
}
public virtual void Withdraw(float amt)
{
balance -= amt;
}
注意我将“存款”更改为+=
,并制定了方法virtual
,这样子类可以override
这个方法,这是(我非常怀疑)这里的意图是什么。另外,float
对于存储资金来说是一个非常糟糕的选择。 decimal
可能是更好的选择。作为一种文体变化,我也将名字大写。
正如大家指出的那样,你应该在你的基类acocunt上声明withdraw()方法,所以所有的派生类都可以继承这个方法。
“account”中没有'.withdraw'方法(最好是通过这种方式来大写你的类名),然而你的派生类有它们 - 为什么不在''基类中包含'.withdraw'的签名?你能发布你如何使用这段代码吗?据我所知,错误信息是正确的。 –
它看起来像很多这些方法实际上应该'虚拟'/'覆盖',顺便说一句 - 并不“存款”通常*增加*余额? –