Dúvida básica - Overwrite, Override e Overload

Pessoal,

Queria saber o significado dos conceitos Overwrite, Override e Overload.

Overload é quando temos algo que é usado para mais de uma função, como em Java o operador “+”, usado pra concatenação de Strings, soma de inteiros e soma de ponto flutuante, por exemplo.

Overwrite é sobrescrita, por exemplo quando temos uma ClasseX, e aí fazemos uma ClasseY herdar da ClasseX. Aí na ClasseY reescrevemos um método, que estava originalmente escrito na ClasseX, porisso se chama Overwrite (escrever por cima).

Tá tudo certo até aí? E agora o Override, o que é???

Errado! O overload de métodos é uma sobrecarga! Ex.:

public void exibeMensagem(){
	System.out.println("Mensagem");
}
public void exibeMensagem(int i){
	System.out.println("Mensagem numero i");
}

Ou seja, quando um método tem o mesmo nome, porém assinaturas diferentes.
Já o override é uma sobreposição de métodos (override=sobreposição no inglês). Ou seja, o método da classe filha se sobrepõe ao da classe pai, como é uma sobreposição o método da classe pai não deixa de existir apenas está “embaixo”. Se você quiser chamar esse método da classe filho basta usar super.metodoPai(). Ex.:

//Faz de conta que esses métodos estão em classes separadas public void exibeMensagem(){ System.out.println("Mensagem classe pai"); } public void exibeMensagem(){ System.out.println("Mensagem classe filho"); } //Depois é só chamar classePai.exibeMensagem();//Imprime: "Mensagem classe pai" classeFilho.exibeMensagem();//Imprime: "Mensagem classe filho"

Já o overwrite eu acho que é a mesma coisa que o override… Pois um sobre escreve e o outro sobrepõe…
Espero ter ajudado!

Cara… sem querer ser chato…

Mas você até agora disse a mesma coisa que eu. OverLoad em inglÊs significa sobrecarga, sim, mas temos overLoad de métodos como temos de outras coisas, por exemplo, de operadores. Em métodos mudamos apenas a assinatura, correto. Eu dei um exemplo de Overload de operadores (com o “+”). Entao vc deu um exemplo de sobrecarga de metodo e eu um exemplo de sobrecarga de operador.

Override é a sobrescrita, tava dando uma lida no livro de Robert W. Sebesta ontem o conceito (livro: Linguagens de programação). É que faz um tempinho que eu não parava pra ler esses conceitos e eu tava lendo um artigo de um cara que chamava de overwrite. Aí fiquei na dúvida se ele tava falando errado ou se era eu que não tava lembrando do nome direito. Como overWrite significa sobrescrever, pensei na parte de herança, como vc disse. Mas realmente, o correto é override (de acordo com a literatura) e eu acho que o pessoal usa overwrite como sinônimo.

Foi a única explicação que eu encontrei.

Overload = escrever vários métodos com o mesmo nome mas com parâmetros diferentes.
Override = escrever o mesmo método, com os mesmos parâmetros. Ou seja, é uma anulação de um método herdado, para fazer o seu especifico. Aqui entra polimorfismo!
Overwrite = não existe tal palavra na especificação ou livros de Java. Talvez seje um sinônimo de override. Pelo menos em nenhum de todos que eu ja li…
Obs: em java não existe “overload de operadores” com em C++…até hoje não!

1 curtida

Me desculpe então. É que geralmente(eu acho que nunca) o programador não modifica a sobrecarga de operadores. Por isso devo ter falado bobagem. Mas eu também acho que overwrite é utilizado como sinônimo para override. Pois na faculdade quando ensinaram herança chamavam essas operações de sobrecarga e sobreescrita.
Abraços…

FernandoFranzini,

o operador "+" é usado para concatenação de Strings, soma de pontos flutuante, soma da inteiros e outras funções (acho que o "++" tb conta como uma função a mais, né?).

é o mesmo operador sendo usado para funções diferentes. Em Robert W. Sebesta, Conceitos de Linguagens de Programação 5ª Edição, o autor diz na página 276 o seguinte: 

“os operadores aritméticos muitas vezes sao usados para mais de uma finalidade. Por exemplo, o + é usado apra adição de quaisquer operandos de tipo numerico. Alugma linguagens, o Java por exemplo, tambem o usa para concatenacao de cadeias. Seu emprego multiplo é chamada de sobrecarga de operador e geralmente é consideravel aceitavel, contanto que a legibilidade e/ou confiabilidade nao sofram.”

Dessa forma, Java usa overload de operadores. Só observando que eu disse que ela USA. Nós programdores podemos usar as sobrecagas que estao presentes na linguagem, mas pelo que eu sei, nao se pode criar uma nova sobrecarga, como criamos um metodo, por exemplo. Eu acho que em C++ a gnt pode criar uma nova sobrecarga, definir uma sobrecarga para um operador. Isso pelo que eu sei, nao foi uma caracteristica passada para a linguagem Java. Foi isso que entendi do que vc falou. 


Ah, e FernandoFranzini, como nosso amigo fernandosavio disse, o método sobrescrito ainda pode ser chamado, poque podemos usar o super.metodoX(); dentro da classe que o está sobrescrevendo. Então a palavra "anulação" deve ser usada com cautela. Pra se falar isso depende do contexto do que se está falando. Porque até certo ponto (dentro da classe filha) o método ainda não está "anulado".

fernandosavio,

Cara, tudo bem! É bom porque uma coisa que se parece tanto, né? overwrite e override, até nos nomes mesmo. Foi porisso que me confundi. Mas acho que é isso mesmo. O pessoal usa como sinônimo. Tu acredita que eu nunca tinha parado pra pensar nessas duas palavras? huahuhauhahahuauhauuaha

[quote]é o mesmo operador sendo usado para funções diferentes. Em Robert W. Sebesta, Conceitos de Linguagens de Programação 5ª Edição, o autor diz na página 276 o seguinte:

“os operadores aritméticos muitas vezes sao usados para mais de uma finalidade. Por exemplo, o + é usado apra adição de quaisquer operandos de tipo numerico. Alugma linguagens, o Java por exemplo, tambem o usa para concatenacao de cadeias. Seu emprego multiplo é chamada de sobrecarga de operador e geralmente é consideravel aceitavel, contanto que a legibilidade e/ou confiabilidade nao sofram.”

Dessa forma, Java usa overload de operadores. Só observando que eu disse que ela USA. Nós programdores podemos usar as sobrecagas que estao presentes na linguagem, mas pelo que eu sei, nao se pode criar uma nova sobrecarga, como criamos um metodo, por exemplo. Eu acho que em C++ a gnt pode criar uma nova sobrecarga, definir uma sobrecarga para um operador. Isso pelo que eu sei, nao foi uma caracteristica passada para a linguagem Java. Foi isso que entendi do que vc falou. [/quote]
Pois é…diante da duvida do amigo…vc deveria ter explicado assim…eu pq eu sei disso mas ele não…acho que vc complico d+, sem necessidade.

Aqui preciso discordar de vc…override é anulação sim…o objeto deixa de executar o método herdado para executar o seu. Isso é tão verdade uma vez que é o foco do override é fazer polimorfismo…E é claro que dentro da classe vc pode chamar super…mas o objetivo é o polimorfismo…

FernandoFranzini,

Veja bem, você NÃO está discordando de mim, até porque eu ENTENDI e CONCORDO com o que vocÊ disse. E isso é a base do polimorfismo, sim. O que eu disse é que deve ter cuidado em dizer que isso é uma “anulação”. Até porque o método ainda do pai ainda pode ser usado mesmo na classe que está reescrevendo, usando-se o “super”. Foi apenas isso o que eu disse.

Para mim, uma coisa que é anulada está sem uso e ponto final, entende? Estou faznedo só uma observação, porque dessa forma é ambíguo. O que não se pode é usar uma classe que tem uma classe filha de outra e dela querer se chamar um método do pai. Aí ele fica como anulado, mesmo. Exemplo:

ClasseX

ClasseY (herda de ClasseX e reescreve um de seus métodos)

ClasseMain (a única que tem o método main e usa APENAS a ClasseY)

na ClasseY o método reescrito AINDA NÃO é NULO, ele pode ser usado, mesmo no método que o reescreve, ele pode ser chamado usando-se o super.metodoReescrito(). No meu entender, até aqui ainda não deveria ser chamado de método anulado, porque POSSO usar ainda, pode ser chamado de mpetodo reescrito, porque estou escrevendo por cima dele, mas uma coisa nula NÃO pode ser usada (no meu entender, levando pelo lado do português), um exemplo disso sao variaveis de instancia com o valor NULL (nulo). Elas podem de alguma forma, qualquer forma serem usadas, tem algum significado, podem executar algum metodo? Nao, ne? Entretanto os metodos sobrescritos podem ser invocados usando-se o super.metodo();

Na ClasseMain a coisa muda de figura, porque eu nao posso, através de uma instância da ClasseY (que é a que ela usa) chamar um método da ClasseX. Aí eu poderia dizer que o método está nulo, porque eu não tenho meios, nao tenho um caminho por onde chamá-lo.
Mas eu entendi completamente o que você falou, só fica meio estranho por conta do portuguÊs, mesmo. Concordo com vocÊ em termos de programação e dos conceitos.

O exemplo que dei nao esta complicado, é um exmplo claro de sobrecarga de operadores. O que eu acho que nao ficou muito claro foi dizer que JAva nao possui tal sobrecarga. Pelo que tem na literatura, ela tem sim, o que nao é permitido é CRIAR uma sobrecarga do nada.

Dessa forma, o override GERA a anulação do metodo dali pra frente. Mas NA CLASSE que PRODUZ o override, o método ainda está vivo. Foi isso que eu disse.

Antes de tudo estamos entrando numa questão de filosofia OO…já q estamos aqui vou te dar meu entendimento do assunto:

[quote]Até porque o método ainda do pai ainda pode ser usado mesmo na classe que está reescrevendo, usando-se o “super”. Foi apenas isso o que eu disse.
Para mim, uma coisa que é anulada está sem uso e ponto final, entende?[/quote]
Sim…mas esse é justamente meu ponto…
Override esta ligado a “especialização”…ou seja, sou FILHO de alguem, faço tudo o que ele faz (herança) mas nesse comportamento aqui eu faço mais especifico. E assim a classe filha tem a autonomia de anular um comportamento q ela herdou, gerando o seu mais especifico. Anular no sentido “não fazer igual” e não no sentido de “não fazer”. A classe tem liberdade de mudar a acontece dentro e não de não ter mais o método.
Partindo do principio que um objeto é unidade funcional com comportamentos que podem ser estimulados externamente (invocados por outros objetos), o override deixa a chamada do super de forma privada e indisponível para objetos invocadores. Ou seja, objetos externo não decidem quando chamar o método do filho ou o do pai…eles são obrigados a se a ter no polimofismo…e isso para mim é anulação.

Justamente.

Porisso eu disse que pra mim essa anulação se ocorre pra frente, depois da classe que herda. Porque na classe que herda o método ainda pode ser invocado. A classe de fora nem sabe da existencia. Eu só disse pra ter cuidado com o significado da palavra anulação. Só isso. Foi apenas uma observação.

Já disse que concordo com o que vc disse. Estamos falando a mesma coisa. Ponto final. Vc ta dizendo a mesma coisa que falei anteriormente.

Tá certo, concordamos!

Boa tarde a todos.

Dentro do conceito de polimorfismo, só existem os conceitos de “Overload” (Sobrecarga) e “Override” (Sobrepor ou Sobrescrita, como queiram).

Quanto a sintaxe Overwrite, que também signfica “Sobrescrita”, até onde eu sei, ela não é uma sintaxe de comando, e nem tão pouco uma diretiva de compilação, mais sim uma propriedade do tipo booleana que existem em vários componentes, não só do Delphi, mas também do VB, que implementa leitura e edição de arquivos, indicando se os mesmos serão sobrepostos ou não.

[quote=gpmdf2]Justamente.

Porisso eu disse que pra mim essa anulação se ocorre pra frente, depois da classe que herda. Porque na classe que herda o método ainda pode ser invocado. A classe de fora nem sabe da existencia. Eu só disse pra ter cuidado com o significado da palavra anulação. Só isso. Foi apenas uma observação.

Já disse que concordo com o que vc disse. Estamos falando a mesma coisa. Ponto final. Vc ta dizendo a mesma coisa que falei anteriormente.

Tá certo, concordamos! [/quote]
kkkkk
:smiley: