簡體   English   中英

“對象”不包含“名稱”的定義

[英]“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類,因此,它會通過兩個繼承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++;
        }
    }
}

您在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM