Cargando...

Sobrecarga

Pon en una clase dos métodos que usen el nombre paint. Un encabezado es static void paint(string word). El otro es static void paint(int n). Los cuerpos son cortos: el primero escribe word, el segundo escribe n. Desde Main llama paint("ok"); y luego paint(3);. La pantalla debería mostrar dos líneas: ok en la primera y 3 en la segunda. C# no trata el segundo paint como un choque. Trata los dos encabezados como métodos distintos porque las listas de parámetros difieren. Ese nombre compartido con listas distintas es lo que enseña esta página. Mantén el nombre de la clase pública Pine.

Mismo nombre, listas distintas

Hasta ahora cada idea nueva usaba un nombre de método fresco: ring, greet, twice. Aquí el nombre se queda paint a propósito. Lo que cambia es lo que hay entre los paréntesis. Una lista guarda un string. Otra lista guarda un int. El compilador conserva ambas porque esas listas no son iguales.
Abre el archivo Pine. El nombre de la clase sigue siendo Pine. Esta página no renombra el tipo. Borra cualquier demo twice que devuelva n * 2 si esa forma es todo lo que aún tienes en Main. Borra cualquier resto de greet. Borra cualquier línea ReadLine. El archivo que guardas no espera escritura.
Fuera de Main, aún dentro de las llaves de la clase, escribe ambos encabezados paint. En esta página mantén void: cada cuerpo escribe, y nada necesita volver a Main por return. El primer cuerpo usa Console.WriteLine(word);. El segundo usa Console.WriteLine(n);. Guarda el archivo antes de ejecutar. El primer programa completo está en el siguiente cuadro.

El archivo que guardas

Esta es la versión que ejecutas primero. Main guarda dos llamadas. La clase guarda dos métodos paint que comparten un nombre.

paint string and paint int

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint("ok");
        paint(3);
    }

    static void paint(string word)
    {
        Console.WriteLine(word);
    }

    static void paint(int n)
    {
        Console.WriteLine(n);
    }
}

Léelo desde arriba. using System; prepara nombres cortos. public class Pine nombra el tipo. public static void Main() es donde arranca el tiempo de ejecución. La primera llamada es paint("ok"). El argumento es un string, así que C# ejecuta el cuerpo que toma string word y escribe ok. La segunda llamada es paint(3). El argumento es un int, así que C# ejecuta el cuerpo que toma int n y escribe 3. El nombre paint es el mismo las dos veces. La lista dentro de los paréntesis es lo que elige el cuerpo. Dos líneas en la pantalla: ok, luego 3.

Ejecútalo con dotnet run. El programa escribe dos líneas y se detiene. No espera a que escribas. Si dotnet run espera, ReadLine sigue en el archivo. Borra esa línea y mantén las dos llamadas paint más los dos métodos paint de arriba. La pantalla muestra ok, luego 3. Si ambas líneas muestran ok, puede que hayas dejado solo el método string y escrito una palabra fija en cada llamada. Si ambas líneas muestran 3, puede que hayas dejado solo el método int. Mantén ambos encabezados. Si la compilación informa que paint ya está definida, comprueba si ambos encabezados tienen la misma lista — por ejemplo dos copias de paint(string word). La sobrecarga necesita una diferencia real en la lista, no una segunda copia del mismo encabezado solo con otro nombre de parámetro. No reinstales el SDK de .NET por una pantalla que muestra líneas incorrectas.

Una segunda lista con dos palabras

El número de parámetros también puede diferir. Añade una tercera sobrecarga que tome dos valores string y los escriba en una línea con un espacio. Deja los dos primeros métodos paint en su sitio cuando practiques los tres juntos. Para una demo centrada solo en esta forma, puedes usar un archivo que guarde solo esta lista.

paint two strings

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint("hi", "sam");
    }

    static void paint(string a, string b)
    {
        Console.WriteLine(a + " " + b);
    }
}

Este es el segundo archivo. Enseña el número como diferencia de lista. Ejecuta dotnet run. La pantalla debería mostrar una línea: hi sam. La llamada tiene dos argumentos. El método tiene dos parámetros. Ese encaje basta para que C# elija este cuerpo. Si aún tienes los paint(string word) y paint(int n) anteriores en la misma clase, puedes dejarlos. Una llamada con dos valores string no elige el método string de un argumento, porque los números difieren.
Cuando pongas las tres sobrecargas en un archivo para practicar, Main puede llamar cada forma en su propia línea. Una llamada con un string sigue yendo a paint(string word). Una llamada con un int sigue yendo a paint(int n). Una llamada con dos valores string va a paint(string a, string b). El nombre compartido no borra esas distinciones. Después de ver hi sam, vuelve a poner el archivo de dos llamadas si esa es la forma que quieres guardar: paint("ok"); luego paint(3);.

Lista vacía junto a una lista string

Un método con paréntesis vacíos también es una lista distinta. Puedes mantener paint() sin parámetros junto a paint(string word). La llamada vacía paint(); ejecuta el cuerpo de la lista vacía. La llamada paint("go"); ejecuta el cuerpo string.

paint empty and paint string

csharp
using System;

public class Pine
{
    public static void Main()
    {
        paint();
        paint("go");
    }

    static void paint()
    {
        Console.WriteLine("ready");
    }

    static void paint(string word)
    {
        Console.WriteLine(word);
    }
}

Este es el tercer archivo. Ejecuta dotnet run. La pantalla debería mostrar ready en la primera línea y go en la segunda. La primera llamada no tiene nada entre los paréntesis, así que encaja con paint(). La segunda llamada envía un string, así que encaja con paint(string word). Renombrar uno a paintReady también compilaría, pero esa es otra habilidad. Esta página mantiene el nombre paint y deja que las listas lleven la diferencia.

Qué llamada ejecuta qué encabezado

Lee las llamadas junto a los encabezados. La lista de argumentos en la llamada debe encajar con la lista de parámetros en el encabezado. El tipo y el número importan ambos en esta forma de principiante.

📊 call beside matching paint

Call in Main Header that runs Screen line
paint("ok"); paint(string word) ok
paint(3); paint(int n) 3
paint("hi", "sam"); paint(string a, string b) hi sam
paint(); paint() ready

Una confusión habitual es escribir dos métodos que digan ambos paint(string word) y esperar que el segundo cuente como sobrecarga. Cambiar solo el nombre del parámetro a paint(string label) no crea una lista nueva para el compilador. El tipo y el número son lo que importa aquí. Otra confusión es llamar paint(true) cuando nunca escribiste una lista de parámetros bool. Entonces la compilación no encuentra un paint que encaje. Añade un encabezado que tome el tipo que quieres, o cambia la llamada a un tipo que ya soportes.
Escribir Console.WriteLine("paint"); en Main escribe la palabra paint. No llama a ningún método. Mantén paint("ok"); cuando quieras la sobrecarga que toma un string. Dejar un método twice sobrante en el mismo archivo puede confundir la pantalla si Main aún escribe twice(7). Limpia Main hasta las llamadas paint que estás probando, y mantén solo las sobrecargas paint que necesitas para esa ejecución.
No anides un método paint dentro de las llaves de Main. Los métodos se sientan dentro de la clase, junto a Main. Dos sobrecargas son dos métodos hermanos en ese mismo cuerpo de clase.

Puedes mantener un nombre de método y varias listas de parámetros en la misma clase. C# elige el cuerpo a partir de la lista de argumentos de la llamada. La pantalla muestra la línea del cuerpo que encaja. Dos encabezados con la misma lista no son sobrecargas. La página siguiente es scope, donde ves qué nombres son visibles dentro de un método y cuáles se quedan fuera.

La pantalla guarda el cuerpo que encaja

El archivo que guardas escribe ok, luego 3, cuando Main llama paint("ok"); y paint(3);. El nombre compartido paint está en cada llamada, y las letras paint no están en la pantalla como etiqueta impresa a menos que las hayas citado. Anidar un método paint dentro de Main no es la forma que construye esta lección.

🧠 Pon a Prueba tu Conocimiento

Listo para Empezar

Pon a Prueba tu Conocimiento

Ponte a prueba con este cuestionario interactivo y descubre qué tan bien entiendes el tema

❓
5
Preguntas
🎯
70%
Para Aprobar
♾️
∞
Tiempo
🔄
∞
Intentos

📝 Instrucciones

  • Lee cada pregunta cuidadosamente
  • Selecciona la mejor respuesta para cada pregunta
  • Puedes repetir el quiz tantas veces como quieras
  • Tu progreso se mostrará en la parte superior