2017-09-15 29 views
0

Je suis nouveau à C# et travaille actuellement sur des méthodes et des constructeurs pour créer un simple programme de retrait bancaire et de dépôt pour calculer le solde après. Je suis soit confus par ces instructions données à moi ou je fais quelque chose de mal. Je n'arrive juste pas à comprendre. J'essaye de placer le solde initial par défaut à $ 1000 tout en réglant le champ d'équilibre en tant que champ en lecture seule.Banque Retirer et Programme de dépôt C#

Le problème principal que je rencontre est que j'essaie de configurer un constructeur pour le champ "Balance" en lecture seule. C# dit que je ne peux pas appeler une méthode en lecture seule. J'ai posté mon code ci-dessous si quelqu'un pouvait m'aider. Merci d'avance.

Account.cs

class Account 
{ 
    public const double defaultBalance = 1000; 
    private double _amount; 
    public double balance; 

    public double Balance 
    { 
     get { return defaultBalance; } 
    } 

    public double Amount 
    { 
     get 
     { 
      return _amount;    
     } 
     set 
     { 
      if (value < 0) 
      { 
       throw new ArgumentException("Please enter an amount greater than 0");     
      } 
      else 
      { 
       _amount = value; 
      } 
     } 
    } 

    public double doDeposit() 
    {   
     balance += _amount; 
     return balance; 
    } 

    public double doWithdrawl() 
    { 
     balance -= _amount; 

     if (balance < 0) 
     { 
      throw new ArgumentException("Withdrawing " + _amount.ToString("C") + " would leave you overdrawn!"); 
     } 
     return balance; 
    } 
} 

main.cs

namespace Account_Teller 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    Account acc = new Account(); 

    private void btnWithdraw_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      acc.Amount = double.Parse(txtAmount.Text); 
      //Error in the line below. "Property cannot be assigned to -- it is read only 
      //Trying to set the initial balance as $1000 using constructor from 'Account' class 
      acc.Balance = double.Parse(lblBalance.Text); 
      lblBalance.Text = acc.doWithdrawl().ToString("C"); 
     } 
     catch (FormatException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     catch (ArgumentException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     catch (Exception error) 
     { 
      MessageBox.Show(error.Message); 
     } 
    } 

    private void btnDeposit_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      acc.Amount = double.Parse(txtAmount.Text); 
      lblBalance.Text = acc.doDeposit().ToString("C"); 
     } 
     catch (FormatException ex) 
     { 
      MessageBox.Show(ex.Message); 
     }  
     catch (ArgumentException ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     catch (Exception error) 
     { 
      MessageBox.Show(error.Message); 
     } 
    }  
} 
+0

Vous ne disposez pas d'un setter sur votre propriété 'Balance'. – Steve

+0

@Steve Les instructions me demandent de définir la balance sur une propriété en lecture seule. Ce ne serait pas un problème si on me permettait d'ajouter un setter. – hyang24

+0

TLDR; Je pense que vous avez besoin de quelque chose comme 'defaultBalance decimal privé;' – Timeless

Répondre

3
  1. Un attribut public (propriété, champ, délégué, événement ou méthode) doit toujours être PascalCase
  2. Au lieu d'avoir un attribut Amount, vous ne devriez pas s comme paramètre aux méthodes, je veux dire; Comme je vois, vous voulez être en mesure de lire Balance à l'extérieur de la classe, mais seulement être en mesure de modifier les méthodes de classe. La réponse consiste à utiliser des propriétés implémentées automatiquement; public decimal Balance { get; private set; }
  3. Habituellement, un compte n'a pas de valeur initiale par défaut, comme l'a déclaré Dax Fohl. Il est plus correspond le d'avoir un constructeur qui vous permettent de définir une valeur initiale
  4. Habituellement, nous n'utilisons pas « faire » comme préfixe pour les verbes à l'infinitif, juste Withdraw et Deposit
  5. Comme Dax et Lars dit, il est plus correspond le à utiliser le type de données décimales pour les monnaies

Ensuite, votre code source Account serait:

class Account { 
    public decimal Balance { get; private set; } 

    public Account(decimal initialBalance) { 
     if(initialBalance < 0) 
      throw new ArgumentOutOfRangeException("The initial balance must be greater or equals to 0"); 
     this.Balance = initialBalance; 
    } 

    public bool TryDeposit(decimal amount) { 
     if(amount <= 0) 
      return false; 
     this.Balance += amount; 
     return true; 
    } 

    public bool TryWithdraw(decimal amount) { 
     if(amount <= 0 || this.Balance - amount < 0) 
      return false 
     this.Balance -= amount; 
     return true; 
    } 
} 
+3

Je mettrais 'DefaultBalance' dans' Program.cs' ou quelque part, et le passerais dans le constructeur 'Account'. Il semble étrange d'avoir une classe de compte qui commence toujours par un montant fixe (autre que zéro). De plus 'decimal' serait plus approprié que 'double' ici. –

+0

@TiesonT. Comme l'équilibreur doit être privé/protégé, vous ne pourrez pas le faire. – 2niru

+2

Je recommande de mettre à jour cette réponse pour utiliser la décimale au lieu du double. Ne laissez jamais la monnaie se rapprocher des points flottants. :) –