Um método sobrecarrega um outro ou ambos são "sobrecarregados"

13

Se eu criar esse método

public void foo()

E então eu crio uma versão sobrecarregada como esta

public void foo( string bar )

Dizemos que a segunda função sobrecarrega a primeira ou os dois métodos são igualmente "sobrecarregados"?

Isso implicaria (eu acho) que existe uma função do tipo base, que está sendo sobrecarregada, por outra função (algo como herança, mas não realmente).

Supondo que um método possa "sobrecarregar outro", também implicaria termos como "sobrecarregador" e "sobrecarga", se isso é uma palavra. Mas isso não parece certo, especialmente porque você pode ter várias sobrecargas.

Cheguei a essa pergunta quando queria escrever o processo de criação de um método sobrecarregado e queria a maneira mais correta de anotá-la.

Exemplos:

  • Estou sobrecarregando foo
  • Estou sobrecarregando foocomfoo( string bar )
  • Estou criando um método sobrecarregado
  • Estou fazendo foo sobrecarregado

Então, sim, isso me fez pensar: não sei o que fazer disso. Existem centenas, senão milhares, de descrições de funções sobrecarregando on-line, mas, à primeira vista, não consegui encontrar nenhuma solução para isso.

Willem D'Haeseleer
fonte
Gostaria de saber por que a palavra sobrecarga foi usada para isso. Parece não fazer sentido. O que está sendo carregado? Como é carregado novamente ou excessivamente?
Martin Maat
@MartinMaat Você leu a resposta aceita pelo comentário de thiton e kindall ? Eles parecem fazer um bom trabalho ao explicar o que está sendo (sobrecarregado).
8bittree
Eu os li, eles explicam o conceito, não a etomologia.
Martin Maat

Respostas:

29

Ao falar sobre sobrecargas, o nome da função está sobrecarregado, não a própria função. As funções que sobrecarregam o nome são "sobrecargas" e sobrecarregam o nome, mas não uma a outra. No seu exemplo, "public void foo()"e os "public void foo( string bar )"dois sobrecarregam o nome "foo". Portanto, você não pode falar em termos de sobrecarga e overloadee de uma das funções, porque elas não têm relacionamento direto.

Nos seus exemplos, você pode dizer que está sobrecarregando "foo" (o nome) com "foo (barra de strings)" (a função), mas não pode dizer que cria um método sobrecarregado, porque os métodos nunca são sobrecarregados. Você pode dizer que criou um método de sobrecarga. Formular "sobrecarregar o foo" é apenas uma maneira pior de dizer "sobrecarregar o foo".

thiton
fonte
Mas, então, nem todas as funções sobrecarregariam seu nome, mesmo que nenhuma outra função tenha a mesma?
precisa saber é o seguinte
Concordo com isso como resposta à pergunta geral acima. Mas se um chama uma das funções da outra, percebo um sentido em que uma sobrecarrega a outra.
Joshua Drake
3
@leftaroundabout: "Sobrecarregar" implica que você está fazendo mais "carregamento" do que o normal, então o termo é usado apenas quando você tem mais de uma função com o mesmo nome.
Kindall
Concordou com @kindall; a palavra "sobrecarga" em um contexto de desenvolvimento de software significa "atribuir mais de um significado a"; sobrecarregar colunas em um banco de dados (o significado depende de outros campos), sobrecarregar parâmetros (o significado depende de outros parâmetros) etc. Um método não sobrecarrega nenhum outro, mas se houver mais de um método com um nome , o nome será " sobrecarregado".
precisa saber é o seguinte
15

Eu simplesmente diria que fooestá sobrecarregado. Certamente não há nenhuma relação de mestre / escravo ou pai / filho acontecendo aqui.

DeadMG
fonte
2
Concordo - é o nome do método ou operador sobrecarregado, não o método em si. Não deve ser confundido com substituição , onde a implementação de um determinado método em uma subclasse suplanta a implementação na classe pai.
Caleb
1
Também concordo com isso, mas acho que thiton faz um trabalho melhor ao explicá-lo. Obrigado pela sua resposta !
Willem D'Haeseleer 19/04/12
3

Eu acho que uma boa maneira de expressar isso é focar no resultado final, não nas alterações feitas na classe ao longo do tempo. Portanto, em vez de dizer "sobrecarreguei 'foo' com 'foo (outros parâmetros)'", você diz "foo é uma função sobrecarregada, com 'foo ()' e 'foo (outros parâmetros)".

mjfgates
fonte