13 - Declaración de una clase y definición de un objeto de dicha clase


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.

Problema 1:

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.

Programa:

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()

Problema 2:

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.

Programa:

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()

Problema 3:

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.)

Programa:

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

Problema 4:

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.

Programa:

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.

Problemas propuestos

  1. Confeccionar una clase que represente un empleado. Definir como atributos su nombre y su sueldo. Confeccionar los métodos para la carga, otro para imprimir sus datos y por último uno que imprima un mensaje si debe pagar impuestos (si el sueldo supera a 3000)
  2. Implementar la clase Operacion. Se deben cargar dos valores enteros, calcular su suma, resta, multiplicación y división, cada una en un método, imprimir dichos resultados.
Solución
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

Retornar