Carregando...

Sobrecarga

Coloque numa classe dois métodos que usam ambos o nome paint. Um cabeçalho é static void paint(string word). O outro é static void paint(int n). Os corpos são curtos: o primeiro escreve word, o segundo escreve n. Em Main chame paint("ok"); e depois paint(3);. A tela deve mostrar duas linhas: ok na primeira e 3 na segunda. C# não trata o segundo paint como conflito. Trata os dois cabeçalhos como métodos diferentes porque as listas de parâmetros diferem. Esse nome partilhado com listas diferentes é o que esta página ensina. Mantenha a classe pública com o nome Pine.

Mesmo nome, listas diferentes

Até agora cada ideia nova usava um nome de método fresco: ring, greet, twice. Aqui o nome fica paint de propósito. O que muda é o que fica entre os parênteses. Uma lista guarda um string. Outra lista guarda um int. O compilador mantém ambos porque essas listas não são iguais.
Abra o arquivo Pine. O nome da classe continua Pine. Esta página não renomeia o tipo. Apague qualquer demo twice que devolve n * 2 se essa forma ainda for tudo o que você tem em Main. Apague qualquer resto de greet. Apague qualquer linha ReadLine. O arquivo que você guarda não espera digitação.
Fora de Main, ainda dentro das chaves da classe, escreva os dois cabeçalhos paint. Mantenha void nesta página: cada corpo escreve, e nada precisa voltar a Main por return. O primeiro corpo usa Console.WriteLine(word);. O segundo usa Console.WriteLine(n);. Guarde o arquivo antes de correr. O primeiro programa completo está na caixa seguinte.

O arquivo que você guarda

Esta é a versão que você corre primeiro. Main guarda duas chamadas. A classe guarda dois métodos paint que partilham um nome.

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);
    }
}

Leia de cima. using System; prepara nomes curtos. public class Pine nomeia o tipo. public static void Main() é onde a execução começa. A primeira chamada é paint("ok"). O argumento é um string, então C# corre o corpo que recebe string word e escreve ok. A segunda chamada é paint(3). O argumento é um int, então C# corre o corpo que recebe int n e escreve 3. O nome paint é o mesmo nas duas vezes. A lista dentro dos parênteses é o que escolhe o corpo. Duas linhas na tela: ok, depois 3.

Corra com dotnet run. O programa escreve duas linhas e para. Não espera que você digite. Se dotnet run esperar, ReadLine ainda está no arquivo. Apague essa linha e mantenha as duas chamadas paint mais os dois métodos paint acima. A tela mostra ok, depois 3. Se ambas as linhas mostrarem ok, você pode ter deixado só o método string e escrito uma palavra fixa em cada chamada. Se ambas as linhas mostrarem 3, você pode ter deixado só o método int. Mantenha os dois cabeçalhos. Se a compilação disser que paint já está definido, verifique se ambos os cabeçalhos têm a mesma lista — por exemplo duas cópias de paint(string word). A sobrecarga precisa de uma diferença real na lista, não de uma segunda cópia do mesmo cabeçalho só com outro nome de parâmetro. Você não reinstala o SDK .NET por uma tela que mostra as linhas erradas.

Uma segunda lista com duas palavras

A contagem de parâmetros também pode diferir. Acrescente uma terceira sobrecarga que recebe dois valores string e os escreve numa linha com um espaço. Deixe os dois primeiros métodos paint no lugar quando praticar os três juntos. Para uma demo focada só nesta forma, você pode usar um arquivo que guarda só 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 é o segundo arquivo. Ensina a contagem como diferença de lista. Corra dotnet run. A tela deve mostrar uma linha: hi sam. A chamada tem dois argumentos. O método tem dois parâmetros. Essa correspondência basta para C# escolher este corpo. Se ainda tiver os paint(string word) e paint(int n) anteriores na mesma classe, pode mantê-los. Uma chamada com dois valores string não escolhe o método string de um argumento, porque as contagens diferem.
Quando colocar as três sobrecargas num arquivo para praticar, Main pode chamar cada forma na sua própria linha. Uma chamada com um string ainda vai para paint(string word). Uma chamada com um int ainda vai para paint(int n). Uma chamada com dois valores string vai para paint(string a, string b). O nome partilhado não apaga essas distinções. Depois de ver hi sam, volte ao arquivo guardado de duas chamadas se for a forma que quer salvar: paint("ok"); depois paint(3);.

Lista vazia ao lado de uma lista string

Um método com parênteses vazios também é uma lista diferente. Você pode manter paint() sem parâmetros ao lado de paint(string word). A chamada vazia paint(); corre o corpo de lista vazia. A chamada paint("go"); corre o corpo 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 é o terceiro arquivo. Corra dotnet run. A tela deve mostrar ready na primeira linha e go na segunda. A primeira chamada não tem nada entre os parênteses, então corresponde a paint(). A segunda chamada envia um string, então corresponde a paint(string word). Renomear um método para paintReady também compilaria, mas é outra competência. Esta página mantém o nome paint e deixa as listas carregarem a diferença.

Qual chamada corre qual cabeçalho

Leia as chamadas ao lado dos cabeçalhos. A lista de argumentos na chamada deve caber na lista de parâmetros do cabeçalho. Tipos e contagem importam ambos nesta forma de iniciante.

📊 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

Uma confusão comum é escrever dois métodos que ambos dizem paint(string word) e esperar que o segundo conte como sobrecarga. Mudar só o nome do parâmetro para paint(string label) não cria uma lista nova para o compilador. O tipo e a contagem são o que importa aqui. Outra confusão é chamar paint(true) quando nunca escreveu uma lista de parâmetros bool. Então a compilação não encontra um paint correspondente. Acrescente um cabeçalho que recebe o tipo que quer, ou mude a chamada para um tipo que já suporte.
Escrever Console.WriteLine("paint"); em Main escreve a palavra paint. Não chama nenhum método. Mantenha paint("ok"); quando quiser a sobrecarga que recebe um string. Deixar um método twice restante no mesmo arquivo pode confundir a tela se Main ainda escrever twice(7). Limpe Main até às chamadas paint que está a testar, e mantenha só as sobrecargas paint necessárias para essa corrida.
Não aninhe um método paint dentro das chaves de Main. Os métodos ficam dentro da classe, ao lado de Main. Duas sobrecargas são dois métodos irmãos nesse mesmo corpo de classe.

Você pode manter um nome de método e várias listas de parâmetros na mesma classe. C# escolhe o corpo pela lista de argumentos da chamada. A tela mostra a linha do corpo correspondente. Dois cabeçalhos com a mesma lista não são sobrecargas. A página seguinte é scope, onde você vê quais nomes são visíveis dentro de um método e quais ficam fora.

A tela guarda o corpo correspondente

O arquivo que você guarda escreve ok, depois 3, quando Main chama paint("ok"); e paint(3);. O nome partilhado paint está em cada chamada, e as letras paint não estão na tela como rótulo impresso a menos que as tenha entre aspas. Aninhar um método paint dentro de Main não é a forma que esta lição constrói.

🧠 Teste Seu Conhecimento

Pronto para Começar

Teste Seu Conhecimento

Desafie-se com este questionário interativo e veja o quão bem você entende o tópico

❓
5
Perguntas
🎯
70%
Para Passar
♾️
∞
Tempo
🔄
∞
Tentativas

📝 Instruções

  • Leia cada pergunta cuidadosamente
  • Selecione a melhor resposta para cada pergunta
  • Você pode refazer o quiz quantas vezes quiser
  • Seu progresso será mostrado no topo