2012-10-30 3 views
0

Je vais avoir un message d'erreur qui me dit ceci:« objet » ne contient pas de définition de « nom »

« BankAccount.account » ne contient pas de définition de « retirer ».

Voici mon code:

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); 
    } 
} 

}

Je ne comprends pas pourquoi il ne le reconnaît pas. C'est une méthode dans la classe savingaccount.

+1

Il n'y a pas de méthode '.withdraw' dans le' compte' (il est préférable de mettre en majuscule les noms de classes), mais vos classes dérivées les ont - pourquoi ne pas inclure une signature pour '.withdraw' dans la classe de base ? Pouvez-vous poster comment vous utilisez ce code? Le message d'erreur est correct pour autant que je puisse voir. –

+0

il semble que beaucoup de ces méthodes devraient en fait être 'virtual' /' override', btw - et ne "dépôt" habituellement * augmenter * l'équilibre? –

Répondre

6

Vous appelez

base.withdraw(amt); 

de votre classe savingsaccount. Mais la classe de base (account) n'a pas une telle méthode. Donc le compilateur est absolument correct.

0

Vous appelez base.withdraw(amt) dans votre classe savingaccount, mais la classe de base account ne définit pas cette méthode.

0

Si vous regardez attentivement, vous verrez que votre classe account n'a pas de méthode withdraw.

Je suppose que vous vouliez dire que votre classe account contiennent une méthode virtuelle withdraw, défini comme ceci: public virtual void withdraw(float amt) { ... }

Ensuite, dans vos classes héritées que vous voudriez remplacer cette méthode, comme suit:

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

Il y a aussi une question de style de nommage avec votre code, mais cela est sans doute pas dans le cadre de cette question :)

+1

Si 'account.withdraw' était' abstract', alors 'base.withdraw()' ne fonctionnerait pas non plus. – Joey

+0

Droite. Je vais arranger ça. – MisterMetaphor

1

I a ssume votre intention était de définir la méthode de base withdraw dans la classe account de base, de sorte qu'elle soit héritée à la fois par savingaccount et currentaccount. Vous devez le déclarer comme virtual afin de pouvoir être remplacé par les classes dérivées, si nécessaire.

class account 
{ 
    public virtual void withdraw(float amt) 
    { 
     if (balance - amt < 0) 
      Console.WriteLine("No balance in account."); 
     else 
      balance -= amt; 
    } 
} 

La classe currentaccount n'a pas besoin sans doute de modifier la logique de cette méthode héritée, vous pouvez l'omettre tout à fait. D'autre part, dans votre savingaccount classe, vous pouvez remplacer la méthode à mettre en œuvre votre comportement personnalisé:

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

Il semble que vous simplement manqué la méthode du type de base:

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

note I changé "dépôt" à +=, et fait la méthode virtual de sorte que les sous-classes peuvent override la méthode, qui est (je soupçonne fortement) ce que l'intention est ici. En outre, float est un très mauvais choix pour stocker de l'argent. decimal pourrait être un meilleur choix. Comme changement de style, j'ai également capitalisé les noms.

0

Comme tout le monde l'a déjà signalé, vous devez déclarer la méthode withdraw() sur votre acocunt de classe de base, afin que toutes les classes dérivées puissent hériter de la méthode.

Questions connexes