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のメソッドです。

4

6 に答える 6

6

あなたが呼んでいる

base.withdraw(amt);

あなたのクラスからsavingsaccount。しかし、基本クラス ( account) にはそのようなメソッドはありません。したがって、コンパイラは絶対に正しいです。

于 2012-10-30T11:55:42.077 に答える
4

基本型からのメソッドを単に見逃したようです:

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

「預金」を に変更し、サブクラスがメソッドを使用できるよう+=にメソッドを作成したことに注意してください。さらに、お金を保管するための非常に悪い選択です。より良い選択かもしれません。スタイルの変更として、名前も大文字にしました。virtualoverridefloatdecimal

于 2012-10-30T12:01:52.497 に答える
1

あなたの意図は、基本クラスで基本的なwithdrawメソッドを定義して、 と の両方にaccount継承されるようにすることだったと思います。必要に応じて、派生クラスによってオーバーライドできるように宣言する必要があります。savingaccountcurrentaccountvirtual

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++;
        }
    }
}
于 2012-10-30T12:00:07.880 に答える
0

クラスで呼び出しbase.withdraw(amt)ますsavingaccountが、基本クラスaccountはこのメソッドを定義していません。

于 2012-10-30T11:56:00.267 に答える
0

よく見ると、実際にはクラスにメソッドaccountがないことがわかります。withdraw

クラスに次のように定義さ accountれた仮想メソッドを含めるつもりだったと思います。withdrawpublic virtual void withdraw(float amt) { ... }

次に、継承されたクラスで、次のようにこのメソッドをオーバーライドします。

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

コードには命名スタイルの問題もありますが、これはおそらくこの質問の範囲外です:)

于 2012-10-30T11:58:41.907 に答える
0

誰もがすでに指摘したように、基本クラスのアカウントでwithdraw()メソッドを宣言して、すべての派生クラスがメソッドを継承できるようにする必要があります。

于 2012-10-30T12:36:44.353 に答える