Normalmente un problema resuelto con la metodología de programación orientada a objetos no interviene una sola clase, sino que hay muchas clases que interactúan y se comunican.
Plantearemos un problema separando las actividades en dos clases.
Un banco tiene 3 clientes que pueden hacer depósitos y extracciones. También el banco requiere que al final del día calcule la cantidad de dinero que hay depositada.
Lo primero que hacemos es identificar las clases:
Podemos identificar la clase Cliente y la clase Banco.
Luego debemos definir los atributos y los métodos de cada clase:
Cliente
atributos
nombre
monto
métodos
constructor
Depositar
Extraer
RetornarMonto
Banco
atributos
3 Cliente (3 objetos de la clase Cliente)
métodos
constructor
Operar
DepositosTotales
Creamos un proyecto llamado: Colaboracion1 y dentro del proyecto creamos dos clases llamadas: Cliente y Banco.
Module Module1
Public Class Cliente
Private nombre As String
Private monto As Integer
Public Sub New(ByVal nom As String)
nombre = nom
monto = 0
End Sub
Public Sub Depositar(ByVal m As Integer)
monto = monto + m
End Sub
Public Sub Extraer(ByVal m As Integer)
monto = monto - m
End Sub
Public Function RetornarMonto() As Integer
Return monto
End Function
Public Sub Imprimir()
Console.WriteLine(nombre & " tiene depositado la suma de " & monto)
End Sub
End Class
Public Class Banco
Private cliente1, cliente2, cliente3 As Cliente
Public Sub New()
cliente1 = New Cliente("Juan")
cliente2 = New Cliente("Ana")
cliente3 = New Cliente("Pedro")
End Sub
Public Sub Operar()
cliente1.Depositar(100)
cliente2.Depositar(150)
cliente3.Depositar(200)
cliente3.Extraer(150)
End Sub
Public Sub DepositosTotales()
Dim t As Integer = cliente1.RetornarMonto() +
cliente2.RetornarMonto() +
cliente3.RetornarMonto()
cliente1.Imprimir()
cliente2.Imprimir()
cliente3.Imprimir()
Console.WriteLine("El total de dinero en el banco es:" & t)
End Sub
End Class
Sub Main()
Dim banco1 As New Banco()
banco1.Operar()
banco1.DepositosTotales()
Console.ReadKey()
End Sub
End Module
Analicemos la implementación del problema.
Los atributos de una clase normalmente son privados para que no se tenga acceso directamente desde otra clase, los atributos son modificados por los métodos de la misma clase:
Public Class Cliente
Private nombre As String
Private monto As Integer
El constructor recibe como parámetro el nombre del cliente y lo almacena en el atributo respectivo e inicializa el atributo monto en cero:
Public Sub New(ByVal nom As String)
nombre = nom
monto = 0
End Sub
Los métodos Depositar y Extraer actualizan el atributo monto con el dinero que llega como parámetro (para simplificar el problema no hemos validado que cuando se extrae dinero el atributo monto quede con un valor negativo):
Public Sub Depositar(ByVal m As Integer)
monto = monto + m
End Sub
Public Sub Extraer(ByVal m As Integer)
monto = monto - m
End Sub
El método RetornarMonto tiene por objetivo comunicar al Banco la cantidad de dinero que tiene el cliente (recordemos que como el atributo monto es privado de la clase, debemos tener un método que lo retorne):
Public Function RetornarMonto() As Integer
Return monto
End Function
Por último el método imprimir muestra nombre y el monto de dinero del cliente:
Public Sub Imprimir()
Console.WriteLine(nombre & " tiene depositado la suma de " & monto)
End Sub
Donde definimos objetos de la clase Cliente?
La respuesta a esta pregunta es que en la clase Banco definimos tres objetos de la clase Cliente.
Veamos ahora la clase Banco que requiere la colaboración de la clase Cliente.
Primero definimos tres atributos de tipo Cliente:
Public Class Banco
Private cliente1, cliente2, cliente3 As Cliente
En le constructor creamos los tres objetos (cada vez que creamos un objeto de la clase Cliente debemos pasar a su constructor el nombre del cliente, recordemos que su monto de depósito se inicializa con cero):
Public Sub New()
cliente1 = New Cliente("Juan")
cliente2 = New Cliente("Ana")
cliente3 = New Cliente("Pedro")
End Sub
El método operar del banco (llamamos a los métodos Depositar y Extraer de los clientes):
Public Sub Operar()
cliente1.Depositar(100)
cliente2.Depositar(150)
cliente3.Depositar(200)
cliente3.Extraer(150)
End Sub
El método DepositosTotales obtiene el monto depositado de cada uno de los tres clientes, procede a mostrarlos y llama al método imprimir de cada cliente para poder mostrar el nombre y depósito:
Public Sub DepositosTotales()
Dim t As Integer = cliente1.RetornarMonto() +
cliente2.RetornarMonto() +
cliente3.RetornarMonto()
cliente1.Imprimir()
cliente2.Imprimir()
cliente3.Imprimir()
Console.WriteLine("El total de dinero en el banco es:" & t)
End Sub
Por último en la Main definimos un objeto de la clase Banco (la clase Banco es la clase principal en nuestro problema):
Sub Main()
Dim banco1 As New Banco()
banco1.Operar()
banco1.DepositosTotales()
Console.ReadKey()
End Sub
Plantear un programa que permita jugar a los dados. Las reglas de juego son: se tiran tres dados si los tres salen con el mismo valor mostrar un mensaje que "gano", sino "perdió".
Lo primero que hacemos es identificar las clases:
Podemos identificar la clase Dado y la clase JuegoDeDados.
Luego los atributos y los métodos de cada clase:
Dado
atributos
valor
métodos
constructor
Tirar
Imprimir
RetornarValor
JuegoDeDados
atributos
3 Dado (3 objetos de la clase Dado)
métodos
constructor
Jugar
Creamos un proyecto llamado: Colaboracion2 y dentro del proyecto creamos dos clases llamadas: Dado y JuegoDeDados.
Module Module1
Public Class Dado
Private valor As Integer
Private Shared ale As Random
Public Sub New()
ale = New Random()
End Sub
Public Sub Tirar()
valor = ale.Next(1, 7)
End Sub
Public Sub Imprimir()
Console.WriteLine("El valor del dado es:" & valor)
End Sub
Public Function RetornarValor() As Integer
Return valor
End Function
End Class
Public Class JuegoDeDados
Private dado1, dado2, dado3 As Dado
Public Sub New()
dado1 = New Dado()
dado2 = New Dado()
dado3 = New Dado()
End Sub
Public Sub Jugar()
dado1.Tirar()
dado1.Imprimir()
dado2.Tirar()
dado2.Imprimir()
dado3.Tirar()
dado3.Imprimir()
If dado1.RetornarValor() = dado2.RetornarValor() And
dado1.RetornarValor() = dado3.RetornarValor() Then
Console.WriteLine("Ganó")
Else
Console.WriteLine("Perdió")
End If
Console.ReadKey()
End Sub
End Class
Sub Main()
Dim j = New JuegoDeDados()
j.Jugar()
End Sub
End Module
La clase Dado define el atributo "valor" donde almacenamos un valor aleatorio que representa el número que sale al el dado.
Definimos otro atributo de la clase Random. Esta clase nos facilita la generación de un número aleatorio que nos indicará el valor del dato. Como luego se crearán tres objetos de la clase dado y nosotros solo requerimos un objeto de la clase Random luego definimos el atributo de tipo Shared, con esto todos los objetos de la clase Dado acceden al mismo objeto de la clase Random:
Public Class Dado
Private valor As Integer
Private Shared ale As Random
En el constructor creamos el objeto de la clase Random:
Public Sub New()
ale = New Random()
End Sub
El método Tirar almacena el valor aleatorio (para generar un valor aleatorio utilizamos el método Next de la clase Random, el mismo genera un valor entero comprendido entre los dos parámetros que le pasamos (nunca genera la cota superior):
Public Sub Tirar()
valor = ale.Next(1, 7)
End Sub
El método Imprimir de la clase Dado muestra por pantalla el valor del dado:
Public Sub Imprimir()
Console.WriteLine("El valor del dado es:" & valor)
End Sub
Por último el método que retorna el valor del dado (se utiliza en la otra clase para ver si los tres dados generaron el mismo valor):
Public Function RetornarValor() As Integer
Return valor
End Function
La clase JuegoDeDatos define tres atributos de la clase Dado (con esto decimos que la clase Dado colabora con la clase JuegoDeDados):
Public Class JuegoDeDados
Private dado1, dado2, dado3 As Dado
En el constructor procedemos a crear los tres objetos de la clase Dado:
Public Sub New()
dado1 = New Dado()
dado2 = New Dado()
dado3 = New Dado()
End Sub
En el método Jugar llamamos al método Tirar de cada dado, pedimos que se imprima el valor generado y finalmente procedemos a verificar si se ganó o no:
Public Sub Jugar()
dado1.Tirar()
dado1.Imprimir()
dado2.Tirar()
dado2.Imprimir()
dado3.Tirar()
dado3.Imprimir()
If dado1.RetornarValor() = dado2.RetornarValor() And
dado1.RetornarValor() = dado3.RetornarValor() Then
Console.WriteLine("Ganó")
Else
Console.WriteLine("Perdió")
End If
Console.ReadKey()
End Sub
En la Main creamos solo un objeto de la clase principal (en este caso la clase principal es el JuegoDeDados):
Sub Main()
Dim j = New JuegoDeDados()
j.Jugar()
End Sub
Module Module1
Public Class Socio
Private nombre As String
Private antiguedad As Integer
Public Sub New()
Console.Write("Ingrese el nombre del socio:")
nombre = Console.ReadLine()
Console.Write("Ingrese la antiguedad:")
antiguedad = Console.ReadLine()
End Sub
Public Sub Imprimir()
Console.WriteLine(nombre + " tiene una antiguedad de " & antiguedad)
End Sub
Public Function RetornarAntiguedad() As Integer
Return antiguedad
End Function
End Class
Class Club
Private socio1, socio2, socio3 As Socio
Public Sub New()
socio1 = New Socio()
socio2 = New Socio()
socio3 = New Socio()
End Sub
Public Sub MayorAntiguedad()
Console.Write("Socio con mayor antiguedad:")
If socio1.RetornarAntiguedad() > socio2.RetornarAntiguedad() And
socio1.RetornarAntiguedad() > socio3.RetornarAntiguedad() Then
socio1.Imprimir()
Else
If socio2.RetornarAntiguedad() > socio3.RetornarAntiguedad() Then
socio2.Imprimir()
Else
socio3.Imprimir()
End If
End If
End Sub
End Class
Sub Main()
Dim club1 = New Club()
club1.MayorAntiguedad()
Console.ReadKey()
End Sub
End Module