2012-10-30 135 views
0

我收到的錯誤消息告訴我:「對象」不包含「名稱」的定義

'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中的一個方法。

+1

「account」中沒有'.withdraw'方法(最好是通過這種方式來大寫你的類名),然而你的派生類有它們 - 爲什麼不在''基類中包含'.withdraw'的簽名?你能發佈你如何使用這段代碼嗎?據我所知,錯誤信息是正確的。 –

+0

它看起來像很多這些方法實際上應該'虛擬'/'覆蓋',順便說一句 - 並不「存款」通常*增加*餘額? –

回答

6

你從你的savingsaccount類調​​用

base.withdraw(amt); 

。但基類(account)沒有這樣的方法。所以編譯器是絕對正確的。

0

您在savingaccount類中調用base.withdraw(amt),但基類account未定義此方法。

0

如果仔細觀察,您會發現account類實際上沒有withdraw方法。

我猜你的意思是讓你的account類包含一個虛方法withdraw,這樣的定義: public virtual void withdraw(float amt) { ... }

然後,在你的繼承類,你會想覆蓋此方法,像這樣:

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

還有一個命名風格問題與您的代碼,但是這可能不是在這個問題:)

+1

如果'account.withdraw'是'abstract',那麼'base.withdraw()'也不起作用。 – Joey

+0

對。我會解決它。 – MisterMetaphor

1

的範圍我一個ssume你的意圖是在基類account類中定義基本的withdraw方法,這樣它將被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++; 
     } 
    } 
} 
4

看起來你只是錯過了從基本型的方法:

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

注意我將「存款」更改爲+=,並制定了方法virtual,這樣子類可以override這個方法,這是(我非常懷疑)這裏的意圖是什麼。另外,float對於存儲資金來說是一個非常糟糕的選擇。 decimal可能是更好的選擇。作爲一種文體變化,我也將名字大寫。

0

正如大家指出的那樣,你應該在你的基類acocunt上聲明withdraw()方法,所以所有的派生類都可以繼承這個方法。