13 - Declaración de una clase y definición de objetos.


La programación orientada a objetos se basa en la programación de clases; a diferencia de la programación estructurada, que está centrada en las funciones.

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

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:

class [nombre de la clase] {
  [atributos o variables de la clase]
  [métodos o funciones de la clase]
  [main]
}

Problema 1:

Confeccionar una clase que permita carga el nombre y la edad de una persona. Mostrar los datos cargados. Imprimir un mensaje si es mayor de edad (edad>=18)

Programa:

Ver video

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PruebaClase1
{
    class Persona 
    { 
        private string nombre;
        private int edad;

        public void Inicializar()
        {
            Console.Write("Ingrese el nombre:");
            nombre = Console.ReadLine();
            string linea;
            Console.Write("Ingrese la edad:");
            linea = Console.ReadLine();
            edad = int.Parse(linea);
        }

        public void Imprimir()
        {
            Console.Write("Nombre:");
            Console.WriteLine(nombre);
            Console.Write("Edad:");
            Console.WriteLine(edad);
        }

        public void EsMayorEdad()
        {
            if (edad >= 18)
            {
                Console.Write("Es mayor de edad");
            }
            else
            {
                Console.Write("No es mayor de edad");
            }
            Console.ReadKey();
        }


        static void Main(string[] args)
        {
            Persona per1 = new Persona();
            per1.Inicializar();
            per1.Imprimir();
            per1.EsMayorEdad();
        }
    }
}

El nombre de la clase debe hacer referencia al concepto (en este caso la hemos llamado Persona):

class Persona 

Los atributos los definimos dentro de la clase pero fuera de la main:

        private string nombre;
        private int edad;

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 función o método de la clase (salvo la main)

Luego de definir los atributos de la clase debemos declarar los métodos o funciones de la clase. La sintaxis es parecida a la main (sin la cláusula static):

        public void Inicializar()
        {
            Console.Write("Ingrese el nombre:");
            nombre = Console.ReadLine();
            string linea;
            Console.Write("Ingrese la edad:");
            linea = Console.ReadLine();
            edad = int.Parse(linea);
        }

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 dos 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:

            Console.Write("Nombre:");
            Console.WriteLine(nombre);
            Console.Write("Edad:");
            Console.WriteLine(edad);

El tercer método tiene por objetivo mostrar un mensaje si la persona es mayor o no de edad:

        public void EsMayorEdad()
        {
            if (edad >= 18)
            {
                Console.Write("Es mayor de edad");
            }
            else
            {
                Console.Write("No es mayor de edad");
            }
            Console.ReadKey();
        }

Por último en la main declaramos un objeto de la clase Persona y llamamos a los métodos en un orden adecuado:

            Persona per1 = new Persona();
            per1.Inicializar();
            per1.Imprimir();
            per1.EsMayorEdad();
Persona per1 = new Persona(); //Declaración y creación del objeto
per1.Inicializar(); //Llamada de un método

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:

Ver video

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PruebaClase2
{
    class Triangulo
    {
        private int lado1, lado2, lado3;

        public void Inicializar()
        {
            string linea;
            Console.Write("Medida lado 1:");
            linea = Console.ReadLine();
            lado1 = int.Parse(linea);
            Console.Write("Medida lado 2:");
            linea = Console.ReadLine();
            lado2 = int.Parse(linea);
            Console.Write("Medida lado 3:");
            linea = Console.ReadLine();
            lado3 = int.Parse(linea);
        }

        public void LadoMayor()
        {
            Console.Write("Lado mayor:");
            if (lado1 > lado2 && lado1 > lado3)
            {
                Console.WriteLine(lado1);
            }
            else
            {
                if (lado2 > lado3)
                {
                    Console.WriteLine(lado2);
                }
                else
                {
                    Console.WriteLine(lado3);
                }
            }
        }

        public void EsEquilatero() 
        {
            if (lado1==lado2 && lado1==lado3) 
            {
                Console.Write("Es un triángulo equilátero");
            }
            else 
            {
                Console.Write("No es un triángulo equilátero");            
            }
        }
    
        static void Main(string[] args)
        {
            Triangulo triangulo1 = new Triangulo();
            triangulo1.Inicializar();
            triangulo1.LadoMayor();
            triangulo1.EsEquilatero();
            Console.ReadKey();
        }
    }
}

Este problema requiere definir tres atributos de tipo entero donde almacenamos los valores de los lados del triángulo:

        private int lado1, lado2, lado3;

El primer método que deberá llamarse desde la main es el Inicializar donde cargamos los tres atributos por teclado:

        public void Inicializar()
        {
            string linea;
            Console.Write("Medida lado 1:");
            linea = Console.ReadLine();
            lado1 = int.Parse(linea);
            Console.Write("Medida lado 2:");
            linea = Console.ReadLine();
            lado2 = int.Parse(linea);
            Console.Write("Medida lado 3:");
            linea = Console.ReadLine();
            lado3 = int.Parse(linea);
        }

El método LadoMayor muestra el valor mayor de los tres enteros ingresados:

        public void LadoMayor()
        {
            Console.Write("Lado mayor:");
            if (lado1 > lado2 && lado1 > lado3)
            {
                Console.WriteLine(lado1);
            }
            else
            {
                if (lado2 > lado3)
                {
                    Console.WriteLine(lado2);
                }
                else
                {
                    Console.WriteLine(lado3);
                }
            }
        }

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 void esEquilatero() {
        if (lado1==lado2 && lado1==lado3) {
            System.out.print("Es un triángulo equilátero");
        } else {
            System.out.print("No es un triángulo equilátero");            
        }
    }

En la main creamos un objeto de la clase Triangulo y llamamos los métodos respectivos:

        static void Main(string[] args)
        {
            Triangulo triangulo1 = new Triangulo();
            triangulo1.Inicializar();
            triangulo1.LadoMayor();
            triangulo1.EsEquilatero();
            Console.ReadKey();
        }

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:

Ver video

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PruebaClase3
{
    class Punto
    {
        private int x, y;

        public void Inicializar() 
        {
            string linea;
            Console.Write("Ingrese coordenada x :");
            linea = Console.ReadLine();
            x = int.Parse(linea);
            Console.Write("Ingrese coordenada y :");
            linea = Console.ReadLine();
            y = int.Parse(linea);
        }

        void ImprimirCuadrante() 
        {
            if (x>0 && y>0) 
            {
                Console.Write("Se encuentra en el primer cuadrante.");
            }
            else 
            {
                if (x<0 && y>0)
                {
                    Console.Write("Se encuentra en el segundo cuadrante.");
                }
                else
                {
                    if (x<0 && y<0) 
                    {
                        Console.Write("Se encuentra en el tercer cuadrante.");
                    }
                    else
                    {
                        if (x>0 && y<0) 
                        {
                            Console.Write("Se encuentra en el cuarto cuadrante.");
                        }
                        else 
                        {
                            Console.Write("El punto no está en un cuadrante.");
                        }
                    }
                }
            }
            Console.ReadKey();
        }
    
        static void Main(string[] args)
        {
            Punto punto1 = new Punto();
            punto1.Inicializar();
            punto1.ImprimirCuadrante();
        }
    }
}

Definimos dos atributos :

        private int x, y;

El método Inicializar pide cargar las coordenadas x e y:

        public void Inicializar() 
        {
            string linea;
            Console.Write("Ingrese coordenada x :");
            linea = Console.ReadLine();
            x = int.Parse(linea);
            Console.Write("Ingrese coordenada y :");
            linea = Console.ReadLine();
            y = int.Parse(linea);
        }

El segundo método mediante un conjunto de if verificamos en que cuadrante se encuentra el punto ingresado:

        void ImprimirCuadrante() 
        {
            if (x>0 && y>0) 
            {
                Console.Write("Se encuentra en el primer cuadrante.");
            }
            else 
            {
                if (x<0 && y>0)
                {
                    Console.Write("Se encuentra en el segundo cuadrante.");
                }
                else
                {
                    if (x<0 && y<0) 
                    {
                        Console.Write("Se encuentra en el tercer cuadrante.");
                    }
                    else
                    {
                        if (x>0 && y<0) 
                        {
                            Console.Write("Se encuentra en el cuarto cuadrante.");
                        }
                        else 
                        {
                            Console.Write("El punto no está en un cuadrante.");
                        }
                    }
                }
            }
            Console.ReadKey();
        }

La Main no tiene grandes diferencias con los problemas realizados anteriormente, declaramos un objeto de la clase Punto, creamos el objeto mediante el operador new y seguidamente llamamos a los métodos Inicializar e ImprimirCuadrante en ese orden:

        static void Main(string[] args)
        {
            Punto punto1 = new Punto();
            punto1.Inicializar();
            punto1.ImprimirCuadrante();
        }

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:

Ver video

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PruebaClase4
{
    class Cuadrado
    {
        private int lado;

        public void Inicializar()
        {
            Console.Write("Ingrese el valor del lado:");
            string linea;
            linea = Console.ReadLine();
            lado=int.Parse(linea);
        }

        public void ImprimirPerimetro()
        {
            int perimetro;
            perimetro=lado*4;
            Console.WriteLine("El perímetro es:"+perimetro);
        }

        public void ImprimirSuperficie()
        {
            int superficie;
            superficie=lado*lado;
            Console.WriteLine("La superficie es:"+superficie);
        }

        static void Main(string[] args)
        {
            Cuadrado cuadrado1 = new Cuadrado();
            cuadrado1.Inicializar();
            cuadrado1.ImprimirPerimetro();
            cuadrado1.ImprimirSuperficie();
            Console.ReadKey();
        }
    }
}

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:

        public void ImprimirPerimetro()
        {
            int perimetro;
            perimetro=lado*4;
            Console.WriteLine("El perímetro es:"+perimetro);
        }

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)

    Ver video

  2. Implementar la clase operaciones. Se deben cargar dos valores enteros, calcular su suma, resta, multiplicación y división, cada una en un método, imprimir dichos resultados.

    Ver video

Solución
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PruebaClase5
{
    class Empleado
    {
        string nombre;
        float sueldo;

        public void Inicializar() 
        {
            string linea;
            Console.Write("Ingrese el nombre del empleado:");
            nombre = Console.ReadLine();
            Console.Write("Ingrese su sueldo:");
            linea = Console.ReadLine();
            sueldo=float.Parse(linea);
        }

        public void PagaImpuestos() 
        {
            if (sueldo>3000) 
            {
                Console.WriteLine("Debe abonar impuestos");
            } 
            else
            {
                Console.WriteLine("No paga impuestos");
            }
            Console.ReadKey();
        }

        static void Main(string[] args)
        {
            Empleado empleado1= new Empleado();
            empleado1.Inicializar();
            empleado1.PagaImpuestos();
        }
    }
}





using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PruebaClase5
{
    class Operaciones
    {
        private int valor1, valor2;

        public void Inicializar() 
        {
            string linea;
            Console.Write("Ingrese primer valor:");
            linea=Console.ReadLine();
            valor1=int.Parse(linea);
            Console.Write("Ingrese segundo valor:");
            linea = Console.ReadLine();
            valor2=int.Parse(linea);
        }

        public void Sumar() 
        {
            int suma;
            suma=valor1+valor2;
            Console.WriteLine("La suma es:"+suma);
        }

        public void Restar() 
        {
            int resta;
            resta=valor1-valor2;
            Console.WriteLine("La resta es:"+resta);        
        }

        public void Multiplicar() 
        {
            int multiplicacion;
            multiplicacion=valor1*valor2;
            Console.WriteLine("La multiplicación es:"+multiplicacion);
        }

        public void Dividir() 
        {
            int division;
            division = valor1 / valor2;
            Console.WriteLine("La división es:" + division);
        }
    

        static void Main(string[] args)
        {
            Operaciones operacion1 = new Operaciones();
            operacion1.Inicializar();
            operacion1.Sumar();
            operacion1.Restar();
            operacion1.Multiplicar();
            operacion1.Dividir();
            Console.ReadKey();
        }
    }
}

Retornar