【问题标题】:"Object" does not contain a definition for "name"“对象”不包含“名称”的定义
【发布时间】:2020-05-05 05:56:33
【问题描述】:

我收到一条错误消息,告诉我:

“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 中的一个方法。

【问题讨论】:

  • account 中没有 .withdraw 方法(最好顺便把你的类名大写),但你的派生类有它们 - 为什么不在 .withdraw 中包含签名基类?您可以发布您如何使用此代码吗?据我所知,错误消息是正确的。
  • 看起来很多这些方法实际上应该是virtual/override,顺便说一句——而且“存款”通常不会增加余额吗?跨度>

标签: c# inheritance polymorphism


【解决方案1】:

正如大家已经指出的,你应该在你的基类账户上声明withdraw()方法,这样所有的派生类都可以继承该方法。

【讨论】:

    【解决方案2】:

    看起来您只是错过了基类型中的方法:

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

    注意,我将“存款”更改为+=,并创建了virtual 方法,以便子类可以使用override 方法,这就是(我强烈怀疑)这里的意图。此外,float 是一个非常糟糕的存钱选择。 decimal 可能是更好的选择。作为风格上的改变,我还把名字大写了。

    【讨论】:

      【解决方案3】:

      我假设您的意图是在基类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】:

        如果您仔细观察,您会发现您的 account 类实际上没有 withdraw 方法。

        我猜你的意思是让你的account 类包含一个虚拟方法withdraw,定义如下: public virtual void withdraw(float amt) { ... }

        然后,在您继承的类中,您希望重写此方法,如下所示:

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

        你的代码还有一个命名风格问题,但这可能不在这个问题的范围内:)

        【讨论】:

        • 如果account.withdrawabstract,那么base.withdraw() 也不起作用。
        【解决方案5】:

        您在savingaccount 类中调用base.withdraw(amt),但基类account 没有定义此方法。

        【讨论】:

          【解决方案6】:

          你在打电话

          base.withdraw(amt);
          

          来自您的班级savingsaccount。但是基类(account)没有这样的方法。所以编译器是绝对正确的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-27
            • 2011-06-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多