2012-10-30 82 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()方法,所以所有的派生类都可以继承这个方法。