Ejemplo: cuentas
Considere el ejemplo de un banco en el que los clientes pueden abrir cuentas y hacer depósitos y retiros de sus cuentas. Puede representar una cuenta mediante una clase de propósito general, denominada Cuenta. Puesto que hay muchos clientes, pueden existir varias instancias de la clase Account simultáneamente.
Después de determinar las clases que necesita, el paso siguiente es determinar los métodos que las clases necesitan para realizar su trabajo. Una clase de cuenta debe proporcionar los siguientes servicios:
- Abra la cuenta.
- Obtener el balance actual.
- Depositar en la cuenta.
- Retirar de la cuenta.
- Estado de cuenta de informe.
Los métodos siguientes para una clase de cuenta satisfacen estas necesidades:
- init
- Abra una cuenta y asígnele un número de cuenta.
- getBalance
- Devuelve el saldo actual de la cuenta.
- crédito
- Deposite una suma determinada en la cuenta.
- débito
- Retire una suma determinada de la cuenta.
- imprimir
- Mostrar el número de cuenta y el saldo de la cuenta.
A medida que diseña una clase de cuenta y sus métodos, descubre la necesidad de que la clase conserve algunos datos de instancia. Normalmente, un objeto Account necesita los siguientes datos de instancia:
- Número de cuenta
- Saldo de cuenta
- Información del cliente: nombre, dirección, teléfono del domicilio, teléfono del trabajo, número de la seguridad social, etc.
Sin embargo, para mantener el ejemplo simple, se presupone que el número de cuenta y el saldo de cuenta son los únicos datos de instancia que la clase Account necesita.
Los diagramas son útiles cuando se diseñan clases y métodos. El diagrama siguiente muestra un primer intento de un diseño de la clase Account:
Las palabras entre paréntesis en los diagramas son los nombres de los datos de instancia, y las palabras que siguen a un número y dos puntos son los nombres de los métodos de instancia.
La estructura siguiente muestra cómo se relacionan las clases entre sí y se conoce como jerarquía de herencia. La clase Account hereda directamente de la clase java.lang.Object.
Subclases
En el ejemplo de cuenta, Account es una clase de propósito general. Sin embargo, un banco podría tener muchos tipos diferentes de cuentas: cuentas corrientes, cuentas de ahorro, préstamos hipotecarios, etc., todos los cuales tienen todas las características generales de las cuentas, pero podrían tener características adicionales no compartidas por todos los tipos de cuentas.
Por ejemplo, una clase CheckingAccount podría tener, además del número de cuenta y el saldo de cuenta que tienen todas las cuentas, una tarifa de cheque que se aplica a cada cheque escrito en la cuenta. Una clase CheckingAccount también necesita un método para procesar comprobaciones (es decir, para leer el importe, debitar al pagador, acreditar al beneficiario, etc.). Por lo tanto, tiene sentido definir CheckingAccount como una subclase de Account y definir en la subclase los datos de instancia adicionales y los métodos de instancia que necesita la subclase.
A medida que diseña la clase CheckingAccount , descubre la necesidad de una clase que modela comprobaciones. Una instancia de clase Check necesita, como mínimo, datos de instancia para el pagador, el beneficiario y el importe del cheque.
Muchas clases adicionales (y lógica de procesamiento de transacciones y bases de datos) necesitarían ser diseñadas en un sistema de cuentas OO del mundo real, pero se han omitido para mantener el ejemplo simple. El diagrama de herencia actualizado se muestra a continuación.
Un número y dos puntos sin ningún nombre de método a continuación indican que el método con ese número se hereda de la superclase.
Herencia múltiple: No puede utilizar herencia múltiple en aplicaciones OO COBOL. Todas las clases que defina deben tener exactamente un padre, y java.lang.Object debe estar en la raíz de cada jerarquía de herencia. Por lo tanto, la estructura de clase de cualquier sistema orientado a objetos definido en una aplicación OO COBOL es un árbol.