[英]“Object” does not contain a definition for “name”
我收到一條錯誤消息,告訴我:
“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 中的一個方法。
你打電話
base.withdraw(amt);
來自你的班級savingsaccount
。 但是基類( account
)沒有這樣的方法。 所以編譯器是絕對正確的。
看起來您只是錯過了基本類型中的方法:
public virtual void Deposit(float amt)
{
balance += amt;
}
public virtual void Withdraw(float amt)
{
balance -= amt;
}
請注意,我將 "deposit" 更改為+=
,並使方法成為virtual
方法,以便子類可以override
該方法,這是(我強烈懷疑)這里的意圖。 此外, float
是存儲資金的一個非常糟糕的選擇。 decimal
可能是更好的選擇。 作為文體上的變化,我也將名稱大寫。
我假設你的意圖是要定義基本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++;
}
}
}
您在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)
...
}
...
}
您的代碼也存在命名樣式問題,但這可能不在此問題的范圍內:)
正如大家已經指出的,你應該在你的基類賬戶上聲明withdraw()方法,這樣所有的派生類都可以繼承該方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.