Requisitos previos
Antes de realizar la prctica debe estar familiarizado con los siguientes temas: Creacin de mtodos en C# Paso de argumentos como parmetros de mtodos en C#
6. La asignacin a created.accNo no daba error de compilacin cuando BankAccount era una estructura, pero no se compila ahora que es una clase. Esto se debe a que, cuando BankAccount era una estructura, la declaracin de la variable created creaba un valor BankAccount (en la pila). Ahora que BankAccount es una clase, la declaracin de la variable created no crea un valor BankAccount; sino una referencia BankAccount que todava no apunta a un objeto BankAccount.
7. Cambie la declaracin de created para que se inicialice con un objeto BankAccount de nueva creacin, como se indica:
class CreateAccount { ... static BankAccount NewBankAccount( ) { BankAccount created = new BankAccount( ); ... created.accNo = number; ... } ... }
8. Guarde el trabajo realizado. 9. Compile y ejecute el programa. Compruebe que los datos introducidos en la consola se leen correctamente y se muestran en el mtodo CreateAccount.Write. Cmo encapsular la clase BankAccount 1. Todos los datos de la clase BankAccount son an pblicos. Modifquelos para que sean privados, como se indica:
class BankAccount { private long accNo; private decimal accBal; private AccountType accType; }
2. Compile el programa. No se compilar. El error se produce en la clase CreateAccount, como se muestra a continuacin:
class CreateAccount { ... static BankAccount NewBankAccount( ) { BankAccount created = new BankAccount( ); ... created.accNo = number; // Error aqu de nuevo ... } ... }
3. Ahora las asignaciones de datos de BankAccount no se compilan porque los datos son privados y slo los mtodos de BankAccount pueden acceder a datos privados de BankAccount. Tiene que escribir un mtodo pblico de BankAccount para que haga las asignaciones. Ejecute los siguientes pasos: Aada a BankAccount un mtodo pblico no esttico llamado Populate. Este mtodo devolver void y recibir dos parmetros: un entero largo (el nmero de la cuenta bancaria) y un decimal (el saldo de la cuenta bancaria). El cuerpo de este mtodo asignar el parmetro entero largo al campo accNo y el parmetro decimal al campo accBal. Tambin dirigir el campo accType a AccountType.Checking, como se muestra a continuacin:
class BankAccount { public void Populate(long number, decimal balance) { accNo = number; accBal = balance; accType = AccountType.Checking; } private long accNo; private decimal accBal; private AccountType accType; }
4. Marque como comentarios las tres asignaciones a la variable created en el mtodo CreateAccount.NewbankAccount y aada en su lugar una instruccin que llame al mtodo Populate sobre la variable created, pasando como argumentos number y balance. El cdigo ser el siguiente:
class CreateAccount { ... static BankAccount NewBankAccount( ) { BankAccount created = new BankAccount( ); ... // created.accNo = number; // created.accBal = balance; // created.accType = AccountType.Checking; created.Populate(number, balance); ... } ... }
6. Compile el programa. No se compilar. En el mtodo CreateAccount.Write quedan todava tres instrucciones que intentan acceder directamente a los campos privados de BankAccount. Tiene que escribir tres mtodos pblicos de BankAccount que devuelvan los valores de estos tres campos. Ejecute los siguientes pasos: a. Aada a BankAccount un mtodo pblico no esttico llamado Number. Este mtodo devolver un entero largo y no recibir ningn parmetro. Devolver el valor del campo accNo, como se muestra a continuacin:
class BankAccount { public void Populate(...) ... public long Number( ) { return accNo; } ... }
b. Aada a BankAccount un mtodo pblico no esttico llamado Balance, como muestra el siguiente cdigo. Este mtodo devolver un decimal y no recibir ningn parmetro. Devolver el valor del campo accBal.
class BankAccount { public void Populate(...) ... ... public decimal Balance( ) { return accBal; } ... }
c. Aada a BankAccount un mtodo pblico no esttico llamado Type, como muestra el siguiente cdigo. Este mtodo devolver un AccountType y no recibir ningn parmetro. Devolver el valor del campo accType.
class BankAccount { public void Populate(...) ... ... public AccountType Type( ) { return accType; } ... }
d. Finalmente, sustituya las tres instrucciones del mtodo CreateAccount.Write que intentan acceder directamente a los campos privados de BankAccount por llamadas a los tres mtodos pblicos que acaba de crear, como se muestra a continuacin:
class CreateAccount { ... static void Write(BankAccount toWrite) { Console.WriteLine("Account number is {0}", toWrite.Number( )); Console.WriteLine("Account balance is {0}", toWrite.Balance( )); Console.WriteLine("Account type is {0}", toWrite.Type( )); } }
7. Guarde el trabajo realizado. 8. Compile el programa y corrija los posibles errores. Ejecute el programa. Compruebe que los datos introducidos en la consola y pasados al mtodo BankAccount.Populate se leen correctamente y se muestran en el mtodo CreateAccount.Write. Cmo encapsular an ms la clase BankAccount 1. Cambie el mtodo BankAccount.Type para que devuelva el tipo de la cuenta como una cadena de caracteres en lugar de cmo una enumeracin AccountType, como se muestra a continuacin:
class BankAccount { ... public string Type( ) { return accType.ToString( ); } ... private AccountType accType; }
2. Guarde el trabajo realizado. 3. Compile el programa y corrija los posibles errores. Ejecute el programa. Compruebe que los datos introducidos en la consola y pasados al mtodo BankAccount.Populate se leen correctamente y se muestran en el mtodo CreateAccount.Write.
3. Aada a la clase BankAccount un mtodo pblico esttico llamado NextNumber, como se ve en el siguiente cdigo. Este mtodo devolver un entero largo y no recibir ningn parmetro. Devolver el valor del campo nextAccNo e incrementar ese campo.
class BankAccount { ... public static long NextNumber( ) { return nextAccNo++; } private long accNo; private decimal accBal; private AccountType accType; private static long nextAccNo; }
4. Marque como comentarios la instruccin del mtodo CreateAccount.NewBankAccount que escribe en la consola un mensaje para pedir el nmero de la cuenta bancaria, como se indica:
//Console.Write("Enter the account number: ");
5. Sustituya la inicializacin de number en el mtodo CreateAccount.NewBankAccount por una llamada al mtodo BankAccount.NextNumber que acaba de crear:
//long number = long.Parse(Console.ReadLine( )); long number = BankAccount.NextNumber( );
6. Guarde el trabajo realizado. 7. Compile el programa y corrija los posibles errores. Ejecute el programa. Compruebe que los dos nmeros de cuenta son 0 y 1. 8. El valor de inicializacin por defecto del campo esttico BankAccount.nextAccNo es cero en estos momentos. Inicialice este campo de forma explcita a 123. 9. Compile y ejecute el programa. Compruebe que los nmeros de las dos cuentas creadas son 123 y 124. Cmo encapsular an ms la clase BankAccount 1. Cambie el mtodo BankAccount.Populate para que slo reciba como parmetro el balance decimal. Dentro del mtodo, asigne el campo accNo utilizando el mtodo esttico BankAccount.NextNumber, como se muestra a continuacin:
class BankAccount { public void Populate(decimal balance) { accNo = NextNumber( ); accBal = balance; accType = AccountType.Checking; } ... }
3. Marque como comentarios la declaracin e inicializacin de number en el mtodo CreateAccount.NewBankAccount. Cambie la llamada al mtodo created.Populate para que pase un solo parmetro, como se indica:
class CreateAccount { ... static BankAccount NewBankAccount( ) { BankAccount created = new BankAccount( ); //long number = BankAccount.NextNumber( ); ... created.Populate(balance); ... } ... }
4. Guarde el trabajo realizado. 5. Compile el programa y corrija los posibles errores. Ejecute el programa. Compruebe que los dos nmeros de cuenta siguen siendo 123 y 124.
10
11
3. Aada a la clase CreateAccount un mtodo pblico esttico llamado TestDeposit, como se ve en el siguiente cdigo. Este mtodo devolver void y recibir un parmetro de BankAccount. El mtodo escribir en la consola un mensaje que pregunte al usuario la cantidad del depsito, capturar como decimal la cantidad introducida y llamar al mtodo Deposit sobre el parmetro BankAccount, pasando la cantidad como argumento.
class CreateAccount { ... public static void TestDeposit(BankAccount acc) { Console.Write("Enter amount to deposit: "); decimal amount = decimal.Parse(Console.ReadLine()); acc.Deposit(amount); } ... }
4. Aada a CreateAccount.Main instrucciones que llamen al mtodo TestDeposit que acaba de crear, como muestra el siguiente cdigo. Compruebe que la llamada a TestDeposit se hace para los dos objetos de cuenta. Use el mtodo CreateAccount.Write para mostrar la cuenta una vez hecho el depsito.
class CreateAccount { static void Main( ) { BankAccount berts = NewBankAccount( ); Write(berts); TestDeposit(berts); Write(berts); BankAccount freds = NewBankAccount( ); Write(freds); TestDeposit(freds); Write(freds); } }
5. Guarde el trabajo realizado. 6. Compile el programa y corrija los posibles errores. Ejecute el programa. Compruebe que los depsitos funcionan correctamente. Nota Si le queda tiempo, puede aadir a Deposit una comprobacin ms para asegurarse de que el parmetro decimal que se pasa no es negativo.
12
Cmo aadir un mtodo Withdraw a la clase BankAccount 7. Aada a la clase BankAccount un mtodo pblico no esttico llamado Withdraw, como se ve en el siguiente cdigo. Este mtodo recibir un parmetro decimal con la cantidad que se desea retirar, y la deducir del saldo slo si se dispone de suficientes fondos, ya que las cuentas no pueden quedar en nmeros rojos. Devolver un valor booleano que indique si la retirada de fondos ha sido correcta.
class BankAccount { ... public bool Withdraw(decimal amount) { bool sufficientFunds = accBal >= amount; if (sufficientFunds) { accBal -= amount; } return sufficientFunds; } ... }
8. Aada a la clase CreateAccount un mtodo pblico esttico llamado TestWithdraw, como se ve en el siguiente cdigo. Este mtodo devolver void y recibir un parmetro de BankAccount. El mtodo escribir en la consola un mensaje que pregunte al usuario la cantidad que desea retirar, capturar como decimal la cantidad introducida y llamar al mtodo Withdraw sobre el parmetro BankAccount, pasando la cantidad como argumento. Capturar el resultado booleano devuelto por Withdraw y escribir un mensaje en la consola si no ha sido posible retirar la cantidad.
class CreateAccount { ... public static void TestWithdraw(BankAccount acc) { Console.Write("Enter amount to withdraw: "); decimal amount = decimal.Parse(Console.ReadLine()); if (!acc.Withdraw(amount)) { Console.WriteLine("Insufficient funds."); } } ... }
13
9. Aada a CreateAccount.Main instrucciones que llamen al mtodo TestWithdraw que acaba de crear, como muestra el siguiente cdigo. Compruebe que la llamada a TestWithdraw se hace para los dos objetos de cuenta. Use el mtodo CreateAccount.Write para mostrar la cuenta una vez retirada la cantidad.
class CreateAccount { static void Main( ) { BankAccount berts = NewBankAccount( ); Write(berts); TestDeposit(berts); Write(berts); TestWithdraw(berts); Write(berts); BankAccount freds = NewBankAccount( ); Write(freds); TestDeposit(freds); Write(freds); TestWithdraw(freds); Write(freds); } }
10. Guarde el trabajo realizado. 11. Compile el programa y corrija los posibles errores. Ejecute el programa. Compruebe que las cantidades se retiran correctamente. Haga pruebas con cantidades que den resultados correctos e incorrectos.