La programación orientada a objetos se basa en la programación de clases.
Una clase es un molde del que luego se pueden crear múltiples objetos, con similares características.
Una clase es una plantilla (molde), que define atributos (variables) y métodos (son los procedimientos)
La clase define los atributos y métodos comunes a los objetos de ese tipo, pero luego, cada objeto tendrá sus propios valores y compartirán las mismas funciones.
Debemos crear una clase antes de poder crear objetos (instancias) de esa clase. Al crear un objeto de una clase, se dice que se crea una instancia de la clase o un objeto propiamente dicho.
La estructura de una clase es:
Public Class [nombre de la clase] [atributos o variables de la clase] [métodos o procedimientos de la clase] End Class
Cuando un algoritmo comienza a ser más complejo no podemos codificar todo en el procedimiento Main:
Sub Main() .... End Sub
Vamos a ver como dividir dicho algoritmo en distintos procedimientos y luego llamarlos desde la Main.
Iremos haciendo una serie de problemas para introducir los conceptos de programación orientada a objetos y ver como organizar el algoritmo dentro de una clase.
Confeccionar una clase que permita cargar el nombre y la edad de una persona. Mostrar los datos cargados. Imprimir un mensaje si es mayor de edad (edad>=18)
Si bien este algoritmo es muy pequeño y lo podemos resolver todo en el procedimiento Main como veníamos trabajando lo que vamos a hacer es plantear una clase que resuelva este problema.
En un principio veremos que parece mucho más complejo pero más adelante veremos que esta forma de organizar un algoritmo mediante clases nos facilita el planteo sobre todo si el problema es más complejo.
Module Module1 Public Class Persona Private nombre As String Private edad As Integer Public Sub Inicializar() Console.Write("Ingrese el nombre:") nombre = Console.ReadLine() Console.Write("Ingrese la edad:") edad = Console.ReadLine() End Sub Public Sub Imprimir() Console.Write("Nombre:") Console.WriteLine(nombre) Console.Write("Edad:") Console.WriteLine(edad) End Sub Public Sub EsMayorEdad() If edad >= 18 Then Console.Write("Es mayor de edad") Else Console.Write("No es mayor de edad") End If Console.ReadKey() End Sub End Class Sub Main() Dim per1 As Persona per1 = New Persona() per1.Inicializar() per1.Imprimir() per1.EsMayorEdad() End Sub End Module
El nombre de la clase debe hacer referencia al concepto (en este caso la hemos llamado Persona):
Public Class Persona
Los atributos(variables) los definimos dentro de la clase (no usamos la palabra clave Dim):
Private nombre As String Private edad As Integer
Veremos más adelante que un atributo es normalmente definido con la cláusula Private (con esto no permitimos el acceso al atributo desde otras clases)
A los atributos se tiene acceso desde cualquier método de la clase. En nuestro problema definimos tres métodos dentro de la clase Persona: Inicializar, Imprimir y EsMayorEdad.
Luego de definir los atributos de la clase debemos declarar los métodos o funciones de la clase. La sintaxis es parecida al procedimineto Main (con la cláusula Public):
Public Sub Inicializar() Console.Write("Ingrese el nombre:") nombre = Console.ReadLine() Console.Write("Ingrese la edad:") edad = Console.ReadLine() End Sub
En el método inicializar (que será el primero que deberemos llamar desde la Main) cargamos por teclado los atributos nombre y edad. Como podemos ver el método inicializar puede hacer acceso a los atributos de la clase Persona.
El segundo método tiene por objetivo imprimir el contenido de los atributos nombre y edad (los datos de los atributos se cargaron al ejecutarse previamente el método inicializar:
Public Sub Imprimir() Console.Write("Nombre:") Console.WriteLine(nombre) Console.Write("Edad:") Console.WriteLine(edad) End Sub
El tercer método tiene por objetivo mostrar un mensaje si la persona es mayor o no de edad:
Public Sub EsMayorEdad() If edad >= 18 Then Console.Write("Es mayor de edad") Else Console.Write("No es mayor de edad") End If Console.ReadKey() End Sub
Por último en la Main declaramos un objeto de la clase Persona y llamamos a los métodos en un orden adecuado:
Sub Main() Dim per1 As Persona per1 = New Persona() per1.Inicializar() per1.Imprimir() per1.EsMayorEdad() End Sub
El procedimiento Sub Main() se encuentra fuera de la clase Persona. Este procedimiento Main es el que primero que se ejecuta al iniciar todo programa en Visual Basic.
Para definir y crear un objeto de la clase persona debemos utilizar la palabra clave Dim y el operador New para crearlo:
Dim per1 As Persona per1 = New Persona()
Luego de creado el objeto per1 de la clase Persona podemos llamar a sus métodos en un orden lógico:
per1.Inicializar() per1.Imprimir() per1.EsMayorEdad()
Desarrollar un programa que cargue los lados de un triángulo e implemente los siguientes métodos: inicializar los atributos, imprimir el valor del lado mayor y otro método que muestre si es equilátero o no.
Module Module1 Public Class Triangulo Private lado1 As Integer Private lado2 As Integer Private lado3 As Integer Public Sub Inicializar() Console.Write("Medida lado 1:") lado1 = Console.ReadLine() Console.Write("Medida lado 2:") lado2 = Console.ReadLine() Console.Write("Medida lado 3:") lado3 = Console.ReadLine() End Sub Public Sub LadoMayor() Console.Write("Lado mayor:") If lado1 > lado2 And lado1 > lado3 Then Console.WriteLine(lado1) Else If lado2 > lado3 Then Console.WriteLine(lado2) Else Console.WriteLine(lado3) End If End If End Sub Public Sub EsEquilatero() If lado1 = lado2 And lado1 = lado3 Then Console.Write("Es un triángulo equilátero") Else Console.Write("No es un triángulo equilátero") End If End Sub End Class Sub Main() Dim triangulo1 As New Triangulo triangulo1.Inicializar() triangulo1.LadoMayor() triangulo1.EsEquilatero() Console.ReadKey() End Sub End Module
Declaramos una clase llamada Triangulo:
Public Class Triangulo ... End Class
Este problema requiere definir tres atributos de tipo entero donde almacenamos los valores de los lados del triángulo:
Private lado1 As Integer Private lado2 As Integer Private lado3 As Integer
El primer método que deberá llamarse desde la Main es el Inicializar donde cargamos los tres atributos por teclado:
Public Sub Inicializar() Console.Write("Medida lado 1:") lado1 = Console.ReadLine() Console.Write("Medida lado 2:") lado2 = Console.ReadLine() Console.Write("Medida lado 3:") lado3 = Console.ReadLine() End Sub
El método LadoMayor muestra el valor mayor de los tres enteros ingresados:
Public Sub LadoMayor() Console.Write("Lado mayor:") If lado1 > lado2 And lado1 > lado3 Then Console.WriteLine(lado1) Else If lado2 > lado3 Then Console.WriteLine(lado2) Else Console.WriteLine(lado3) End If End If End Sub
Como podemos observar cuando un problema se vuelve más complejo es más fácil y ordenado separar los distintos algoritmos en varios métodos y no codificar todo en la Main.
El último método de esta clase verifica si los tres enteros ingresados son iguales:
Public Sub EsEquilatero() If lado1 = lado2 And lado1 = lado3 Then Console.Write("Es un triángulo equilátero") Else Console.Write("No es un triángulo equilátero") End If End Sub
En la main definimos y creamos un objeto de la clase Triangulo y llamamos los métodos respectivos:
Sub Main() Dim triangulo1 As New Triangulo triangulo1.Inicializar() triangulo1.LadoMayor() triangulo1.EsEquilatero() Console.ReadKey() End Sub
Lo más común es declarar y crear el objeto de la clase Triangulo en una única línea:
Dim triangulo1 As New Triangulo
La otra forma que vimos en el ejemplo 1 sería con la sintaxis:
Dim triangulo1 As Triangulo triangulo1=New Triangulo()
Desarrollar una clase que represente un punto en el plano y tenga los siguientes métodos: cargar los valores de x e y, imprimir en que cuadrante se encuentra dicho punto (concepto matemático, primer cuadrante si x e y son positivas, si x<0 e y>0 segundo cuadrante, etc.)
Module Module1 Public Class Punto Private x As Integer Private y As Integer Public Sub Inicializar() Console.Write("Ingrese coordenada x :") x = Console.ReadLine() Console.Write("Ingrese coordenada y :") y = Console.ReadLine() End Sub Public Sub ImprimirCuadrante() If x > 0 And y > 0 Then Console.Write("Se encuentra en el primer cuadrante.") Else If x < 0 And y > 0 Then Console.Write("Se encuentra en el segundo cuadrante.") Else If x < 0 And y < 0 Then Console.Write("Se encuentra en el tercer cuadrante.") Else If x > 0 And y < 0 Then Console.Write("Se encuentra en el cuarto cuadrante.") Else Console.Write("El punto no está en un cuadrante.") End If End If End If End If End Sub End Class Sub Main() Dim punto1 = New Punto() punto1.Inicializar() punto1.ImprimirCuadrante() Console.ReadKey() End Sub End Module
Declaramos la clase Punto:
Public Class Punto End Class
Definimos dos atributos enteros dentro de la clase Punto (estas valores pueden ser accedidos luego en los métodos que definamos en la clase):
Public Class Punto Private x As Integer Private y As Integer ... End Class
El método Inicializar pide cargar las coordenadas x e y:
Public Sub Inicializar() Console.Write("Ingrese coordenada x :") x = Console.ReadLine() Console.Write("Ingrese coordenada y :") y = Console.ReadLine() End Sub
El segundo método mediante un conjunto de if verificamos en que cuadrante se encuentra el punto ingresado:
Public Sub ImprimirCuadrante() If x > 0 And y > 0 Then Console.Write("Se encuentra en el primer cuadrante.") Else If x < 0 And y > 0 Then Console.Write("Se encuentra en el segundo cuadrante.") Else If x < 0 And y < 0 Then Console.Write("Se encuentra en el tercer cuadrante.") Else If x > 0 And y < 0 Then Console.Write("Se encuentra en el cuarto cuadrante.") Else Console.Write("El punto no está en un cuadrante.") End If End If End If End If End Sub
La Main no tiene grandes diferencias con los problemas realizados anteriormente, declaramos un objeto llamado punto1 de la clase Punto, creamos el objeto mediante el operador New y seguidamente llamamos a los métodos Inicializar e ImprimirCuadrante en ese orden:
Sub Main() Dim punto1 = New Punto() punto1.Inicializar() punto1.ImprimirCuadrante() Console.ReadKey() End Sub
Desarrollar una clase que represente un Cuadrado y tenga los siguientes métodos: cargar el valor de su lado, imprimir su perímetro y su superficie.
Module Module1 Public Class Cuadrado Private lado As Integer Public Sub Inicializar() Console.Write("Ingrese el valor del lado:") lado = Console.ReadLine() End Sub Public Sub ImprimirPerimetro() Dim perimetro As Integer perimetro = lado * 4 Console.Write("El perímetro es:") Console.WriteLine(perimetro) End Sub Public Sub ImprimirSuperficie() Dim superficie As Integer superficie = lado * lado Console.Write("La superficie es:") Console.Write(superficie) End Sub End Class Sub Main() Dim cuadrado1 As New Cuadrado() cuadrado1.Inicializar() cuadrado1.ImprimirPerimetro() cuadrado1.ImprimirSuperficie() Console.ReadKey() End Sub End Module
En este problema es interesante ver como no definimos dos atributos donde se almacenan la superficie y el perímetro del cuadrado, esto debido a que solo estos datos se los requiere en el método donde se imprimen (se definen variables locales a dichos métodos):
Public Sub ImprimirPerimetro() Dim perimetro As Integer perimetro = lado * 4 Console.Write("El perímetro es:") Console.WriteLine(perimetro) End Sub
Esto significa que la variable perimetro es una variable local al método ImprimirPerimetro. Esta variable es local a dicho método y solo se la puede acceder dentro del método. La diferencia fundamental entre una variable local y un atributo de la clase es que al atributo se lo puede acceder desde cualquier método de la clase y la variable local solo existe mientras se está ejecutando el método.
Module Module1 Public Class Empleado Private nombre As String Private sueldo As Single Public Sub Inicializar() Console.Write("Ingrese el nombre del empleado:") nombre = Console.ReadLine() Console.Write("Ingrese su sueldo:") sueldo = Console.ReadLine() End Sub Public Sub PagaImpuestos() If sueldo > 3000 Then Console.WriteLine("Debe abonar impuestos") Else Console.WriteLine("No paga impuestos") End If End Sub End Class Sub Main() Dim empleado1 As New Empleado() empleado1.Inicializar() empleado1.PagaImpuestos() Console.ReadKey() End Sub End Module Module Module1 Public Class Operaciones Private valor1 As Integer Private valor2 As Integer Public Sub Inicializar() Console.Write("Ingrese primer valor:") valor1 = Console.ReadLine() Console.Write("Ingrese segundo valor:") valor2 = Console.ReadLine() End Sub Public Sub Sumar() Dim suma As Integer suma = valor1 + valor2 Console.Write("La suma es:") Console.WriteLine(suma) End Sub Public Sub Restar() Dim resta As Integer resta = valor1 - valor2 Console.Write("La resta es:") Console.WriteLine(resta) End Sub Public Sub Multiplicar() Dim multiplicacion As Integer multiplicacion = valor1 * valor2 Console.Write("La multiplicación es:") Console.WriteLine(multiplicacion) End Sub Public Sub dividir() Dim division As Integer division = valor1 / valor2 Console.Write("La división es:") Console.WriteLine(division) End Sub End Class Sub Main() Dim operacion1 = New Operaciones() operacion1.Inicializar() operacion1.Sumar() operacion1.Restar() operacion1.Multiplicar() operacion1.dividir() Console.ReadKey() End Sub End Module