67 - Sobrecarga de métodos


La sobrecarga de métodos permite definir dos o más métodos con el mismo nombre, pero que difieren en cantidad o tipo de parámetros.

Esta característica del lenguaje nos facilita la implementación de algoritmos que cumplen la misma función pero que difieren en los parámetros.

Problema 1:

Implementar dos métodos que sumen dos enteros en el primer caso y que concatenen dos string en el segundo.

Programa:


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

namespace SobrecargaParametros1
{
    class Program
    {
        public int Sumar(int x1, int x2)
        {
            int s = x1 + x2;
            return s;
        }

        public string Sumar(string s1, string s2)
        {
            string s = s1 + s2;
            return s;
        }

        static void Main(string[] args)
        {
            Program p = new Program();
            Console.WriteLine("La suma de 5+10 es:" + p.Sumar(5, 10));
            Console.WriteLine("La concatenacion de \"Juan\" y \" Carlos\" es "+p.Sumar("Juan"," Carlos"));
            Console.ReadKey();
        }
    }
}

Como podemos ver definimos dos métodos llamados Sumar con dos parámetros cada uno (el primero con parámetros de tipo int y el segundo con parámetros de tipo string):


        public int Sumar(int x1, int x2)
        {
            int s = x1 + x2;
            return s;
        }

        public string Sumar(string s1, string s2)
        {
            string s = s1 + s2;
            return s;
        }

Cuando llamamos a los métodos el compilador sabe con cual enlazarlos según el tipo de datos enviados.

Si le enviamos dos enteros se llama el primer método:

            Console.WriteLine("La suma de 5+10 es:" + p.Sumar(5, 10));

Si le enviamos dos string se llama el segundo método:

            Console.WriteLine("La concatenacion de \"Juan\" y \" Carlos\" es "+p.Sumar("Juan"," Carlos"));

Problema 2:

Plantear una clase llamada Ventana que defina cuatro métodos sobrecargados que muestren un mensaje en la consola.
El primero lo muestrar donde se encuentra actualmente el cursor.
El segundo lo muestra en una determinada columna y fila.
El tercero lo muestra en una determinada columna,fila y con un color de letra.
Y por último similar al anterior más un color de fondo.

Programa:

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

namespace SobrecargaParametros2
{
    class Ventana
    {
        public void Mostrar(string mensaje)
        {
            Console.Write(mensaje);
        }

        public void Mostrar(string mensaje, int columna,int fila)
        {
            Console.SetCursorPosition(columna, fila);
            Console.Write(mensaje);
        }

        public void Mostrar(string mensaje, int columna, int fila,ConsoleColor colorletra)
        {
            Console.ForegroundColor = colorletra;
            Mostrar(mensaje, columna, fila);
        }

        public void Mostrar(string mensaje, int columna, int fila, ConsoleColor colorletra,ConsoleColor colorfondo)
        {
            Console.BackgroundColor = colorfondo;
            Mostrar(mensaje, columna, fila, colorletra);            
        }

        static void Main(string[] args)
        {
            Ventana v = new Ventana();
            v.Mostrar("Hola Mundo");
            v.Mostrar("Hola Mundo", 30, 10);
            v.Mostrar("Hola Mundo", 30, 12, ConsoleColor.Red);
            v.Mostrar("Hola Mundo", 30, 14, ConsoleColor.Red, ConsoleColor.Blue);
            Console.ReadKey();
        }
    }
}

Como podemos observar hemos definido cuatro métodos llamados Mostrar que difieren en la cantidad de parámetros.
El primero recibe un string y lo muestra en la consola:

        public void Mostrar(string mensaje)
        {
            Console.Write(mensaje);
        }

El segundo recibe tres parámetros con el mensaje, la columna y fila donde mostrarlo:

        public void Mostrar(string mensaje, int columna,int fila)
        {
            Console.SetCursorPosition(columna, fila);
            Console.Write(mensaje);
        }

Como podemos observar la clase Console tiene un método llamado SetCursorPosition que le pasamos la columna y fila donde queremos que se posicione el cursor previo a la salida de datos llamando al método Write.

El tercer método recibe cuatro parámetros y como podemos ver desde dentro de este método llamamos al método Mostrar que recibe tres parámetros:

        public void Mostrar(string mensaje, int columna, int fila,ConsoleColor colorletra)
        {
            Console.ForegroundColor = colorletra;
            Mostrar(mensaje, columna, fila);
        }

Para cambiar el color de la letra de la Console debemos inicializar la propiedad ForegroundColor.

El último método es similar al tercero pero con un quinto parámetro:


        public void Mostrar(string mensaje, int columna, int fila, ConsoleColor colorletra,ConsoleColor colorfondo)
        {
            Console.BackgroundColor = colorfondo;
            Mostrar(mensaje, columna, fila, colorletra);
            
        }

Problema propuesto

  1. Plantear una clase que sobrecargue un método que permita cargar por referencia (out) distintos tipos de datos primitivos por teclado.
Solución

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

namespace SobrecargaParametros3
{
    class EntradaTeclado
    {
        public void Leer(out int valor)
        {
            valor = int.Parse(Console.ReadLine());
        }

        public void Leer(out float valor)
        {
            valor = float.Parse(Console.ReadLine());
        }

        public void Leer(out char valor)
        {
            valor = char.Parse(Console.ReadLine());
        }

        public void Leer(out bool valor)
        {
            valor = bool.Parse(Console.ReadLine());
        }

        static void Main(string[] args)
        {
            EntradaTeclado et = new EntradaTeclado();
            int x;
            Console.Write("Ingrese un entero:");
            et.Leer(out x);
            Console.WriteLine("El valor ingresado es:" + x);
            float f;
            Console.Write("Ingrese un valor real:");
            et.Leer(out f);
            Console.WriteLine("El valor ingresado es:" + f);
            char car;
            Console.Write("Ingrese un valor caracter:");
            et.Leer(out car);
            Console.WriteLine("El valor ingresado es:" + car);
            bool l;
            Console.Write("Ingrese un valor logico:");
            et.Leer(out l);
            Console.WriteLine("El valor ingresado es:" + l);
            Console.ReadKey();
        }
    }
}

Retornar