Em termos de Java, quando alguém pergunta:
o que é polimorfismo?
Iria sobrecarregar ou substituindo ser uma resposta aceitável?
Eu acho que há um pouco mais do que isso.
Se você tinha uma classe base abstrata que definiu um método sem implementação e definiu esse método na subclasse, isso ainda está substituindo?
Eu acho que sobrecarregar não é a resposta certa, com certeza.
java
oop
polymorphism
overloading
overriding
Brian G
fonte
fonte
Respostas:
A maneira mais clara de expressar o polimorfismo é através de uma classe base abstrata (ou interface)
Esta classe é abstrata porque o
goPee()
método não é definível para seres humanos. É apenas definível para as subclasses Macho e Fêmea. Além disso, humano é um conceito abstrato - você não pode criar um humano que não seja masculino nem feminino. Tem que ser um ou outro.Portanto, adiamos a implementação usando a classe abstrata.
e
Agora podemos dizer a uma sala inteira cheia de humanos para fazer xixi.
Executar isso renderia:
fonte
goPee
não aceita um campo gravitacional como entrada. Essa dependência do estado global dificulta o teste de unidadeCatheterizedIntersexAstronaut
e mostra que a subclasse nem sempre pode ser o melhor método para a composição de características.Polimorfismo é a capacidade de uma instância de classe se comportar como se fosse uma instância de outra classe em sua árvore de herança, geralmente uma de suas classes ancestrais. Por exemplo, em Java todas as classes herdam de Object. Portanto, você pode criar uma variável do tipo Object e atribuir a ela uma instância de qualquer classe.
Uma substituiçãoé um tipo de função que ocorre em uma classe que herda de outra classe. Uma função de substituição "substitui" uma função herdada da classe base, mas o faz de tal maneira que é chamada mesmo quando uma instância de sua classe está fingindo ser um tipo diferente por meio do polimorfismo. Referindo-se ao exemplo anterior, você pode definir sua própria classe e substituir a função toString (). Como essa função é herdada de Object, ainda estará disponível se você copiar uma instância dessa classe em uma variável do tipo Object. Normalmente, se você chamar toString () na sua classe enquanto ela estiver fingindo ser um Objeto, a versão do toString que realmente será acionada será a definida no próprio Objeto. No entanto, como a função é uma substituição, a definição de toString () da sua classe é usada mesmo quando a instância da classe '
Sobrecarregar é a ação de definir vários métodos com o mesmo nome, mas com parâmetros diferentes. Não está relacionado à substituição ou ao polimorfismo.
fonte
Ad hoc polymorphism
é o que você descreveu na seção Sobrecarga e é um caso de polimorfismo.Polimorfismo significa mais de uma forma, o mesmo objeto executando operações diferentes de acordo com o requisito.
O polimorfismo pode ser alcançado usando duas maneiras, essas são
Sobrecarga de método significa escrever dois ou mais métodos na mesma classe usando o mesmo nome de método, mas os parâmetros de passagem são diferentes.
Substituição de método significa que usamos os nomes de método nas diferentes classes, ou seja, o método da classe pai é usado na classe filho.
Em Java, para obter polimorfismo, uma variável de referência de superclasse pode conter o objeto de subclasse.
Para atingir o polimorfismo, todo desenvolvedor deve usar o mesmo nome de método no projeto.
fonte
Aqui está um exemplo de polimorfismo no pseudo-C # / Java:
A função Main não conhece o tipo do animal e depende do comportamento de uma implementação específica do método MakeNoise ().
Edit: Parece que Brian me venceu no soco. Engraçado, usamos o mesmo exemplo. Mas o código acima deve ajudar a esclarecer os conceitos.
fonte
Tanto a substituição quanto a sobrecarga são usadas para alcançar o polimorfismo.
Você pode ter um método em uma classe que é substituída em uma ou mais subclasses. O método faz coisas diferentes, dependendo de qual classe foi usada para instanciar um objeto.
Você também pode ter um método sobrecarregado com dois ou mais conjuntos de argumentos. O método faz coisas diferentes com base no (s) tipo (s) de argumento (s) passado (s).
fonte
Você está certo de que sobrecarregar não é a resposta.
Nem é substituindo. Substituir é o meio pelo qual você obtém polimorfismo. Polimorfismo é a capacidade de um objeto variar o comportamento com base em seu tipo. Isso é melhor demonstrado quando o chamador de um objeto que exibe polimorfismo não tem conhecimento do tipo específico de objeto.
fonte
Especificamente, dizer sobrecarregar ou substituir não fornece uma imagem completa. Polimorfismo é simplesmente a capacidade de um objeto de especializar seu comportamento com base em seu tipo.
Eu discordo de algumas das respostas aqui em que a sobrecarga é uma forma de polimorfismo (polimorfismo paramétrico) no caso em que um método com o mesmo nome pode se comportar de maneira diferente, fornecendo diferentes tipos de parâmetros. Um bom exemplo é a sobrecarga do operador. Você pode definir "+" para aceitar diferentes tipos de parâmetros - digamos strings ou int's - e com base nesses tipos, "+" se comportará de maneira diferente.
O polimorfismo também inclui métodos de herança e substituição, embora possam ser abstratos ou virtuais no tipo base. Em termos de polimorfismo baseado em herança, Java suporta apenas herança de classe única, limitando seu comportamento polimórfico ao de uma única cadeia de tipos de base. Java suporta a implementação de várias interfaces, que é outra forma de comportamento polimórfico.
fonte
Polimorfismo significa simplesmente "Muitas Formas".
Não é necessário herança para alcançar ... pois a implementação da interface, que não é herança, serve a necessidades polimórficas. Indiscutivelmente, a implementação da interface atende às necessidades polimórficas "Melhor" que a herança.
Por exemplo, você criaria uma superclasse para descrever todas as coisas que podem voar? Eu acho que não. Você ficaria melhor servido para criar uma interface que descreve o voo e deixá-lo assim.
Portanto, como as interfaces descrevem o comportamento e os nomes dos métodos descrevem o comportamento (para o programador), não é muito difícil considerar a sobrecarga de método como uma forma menor de polimorfismo.
fonte
O exemplo clássico, cães e gatos são animais, os animais têm o método makeNoise. Posso iterar através de uma variedade de animais chamando makeNoise para eles e esperar que eles façam a respectiva implementação.
O código de chamada não precisa saber que animal específico eles são.
Isso é o que eu considero polimorfismo.
fonte
Polimorfismo é a capacidade de um objeto aparecer de várias formas. Isso envolve o uso de herança e funções virtuais para criar uma família de objetos que podem ser trocados. A classe base contém os protótipos das funções virtuais, possivelmente não implementadas ou com implementações padrão conforme o aplicativo exigir, e as várias classes derivadas as implementam de maneira diferente para afetar comportamentos diferentes.
fonte
Nem:
Sobrecarga é quando você tem o mesmo nome de função que usa parâmetros diferentes.
Substituir é quando uma classe filho substitui o método de um pai por um método próprio (isso por si só não constitui polimorfismo).
O polimorfismo é uma ligação tardia, por exemplo, os métodos da classe base (pai) estão sendo chamados, mas não até o tempo de execução o aplicativo saber qual é o objeto real - pode ser uma classe filho cujos métodos são diferentes. Isso ocorre porque qualquer classe filho pode ser usada onde uma classe base é definida.
Em Java, você vê muito polimorfismo com a biblioteca de coleções:
List é a classe base, o compilador não tem idéia se você está contando uma lista vinculada, vetor, matriz ou uma implementação de lista personalizada, desde que ela funcione como uma lista:
Se você estivesse sobrecarregando, teria:
e a versão correta de countStuff () seria escolhida pelo compilador para corresponder aos parâmetros.
fonte
Embora o polimorfismo já esteja explicado em grandes detalhes neste post, eu gostaria de enfatizar mais por que parte dele.
Vamos tentar criar um aplicativo simples para uma TV com e sem herança / polimorfismo. Poste cada versão do aplicativo, fazemos uma pequena retrospectiva.
Supondo que você seja um engenheiro de software de uma empresa de TV e seja solicitado a escrever um software para os controladores de volume, brilho e cor, para aumentar e diminuir seus valores no comando do usuário.
Você começa escrevendo aulas para cada um desses recursos adicionando
Agora você tem nossa primeira versão do aplicativo de trabalho pronta para ser implantada. Hora de analisar o trabalho realizado até agora.
Você decide viver com isso desde que seu aplicativo funcione conforme o esperado.
Você começa a escrever uma nova classe (ResetFunctionV2) para a nova funcionalidade e mapeia o código de mapeamento de entrada do usuário para esse novo recurso.
Então você tem seu aplicativo pronto com o recurso Redefinir. Mas agora você começa a perceber que
Agora você começa a pensar que esse novo recurso a ser adicionado se assemelha ao recurso Redefinir e os Problemas de aplicativo (V2) serão multiplicados se você não fatorar novamente seu aplicativo.
Você começa a pensar em usar herança para tirar proveito da capacidade polimórfica do JAVA e adiciona uma nova classe abstrata (ControllerV3) ao
Com essas melhorias, você tem a versão 3 do seu aplicativo de TV pronta para você.
Embora a maior parte do problema listado na lista de problemas da V2 tenha sido abordado, exceto
Novamente, você pensa em resolver esse problema, já que agora possui outro recurso (atualização de driver na inicialização) para implementar. Se você não corrigi-lo, ele também será replicado para novos recursos.
Então você divide o contrato definido na classe abstrata e escreve 2 interfaces para
E faça com que sua 1ª classe concreta os implemente como abaixo
Espero que isto ajude :-)
fonte
O termo sobrecarga refere-se a várias versões de algo com o mesmo nome, geralmente métodos com diferentes listas de parâmetros
Portanto, essas funções podem fazer a mesma coisa, mas você tem a opção de chamá-lo com um ID ou um nome. Não tem nada a ver com herança, classes abstratas etc.
Substituição geralmente se refere ao polimorfismo, como você descreveu na sua pergunta
fonte
sobrecarga é quando você define 2 métodos com o mesmo nome, mas com parâmetros diferentes
overriding é onde você altera o comportamento da classe base por meio de uma função com o mesmo nome em uma subclasse.
Portanto, o polimorfismo está relacionado à substituição, mas não à sobrecarga.
No entanto, se alguém me desse uma resposta simples de "substituição" da pergunta "O que é polimorfismo?" Eu pediria mais explicações.
fonte
substituir é mais como ocultar um método herdado declarando um método com o mesmo nome e assinatura que o método de nível superior (super método), isso adiciona um comportamento polimórfico à classe. em outras palavras, a decisão de escolher qual método de nível a ser chamado será tomada no tempo de execução e não no tempo de compilação. isso leva ao conceito de interface e implementação.
fonte
Do tutorial em java
A definição de polimorfismo no dicionário refere-se a um princípio em biologia no qual um organismo ou espécie pode ter muitas formas ou estágios diferentes. Esse princípio também pode ser aplicado a programação orientada a objetos e linguagens como a linguagem Java. As subclasses de uma classe podem definir seus próprios comportamentos exclusivos e ainda compartilhar algumas das mesmas funcionalidades da classe pai.
Ao considerar os exemplos e a definição, a substituição deve ser aceita como resposta.
Em relação à sua segunda consulta:
Deve ser chamado de substituição.
Dê uma olhada neste exemplo para entender os diferentes tipos de substituição.
super.methodName()
como primeira instruçãofragmento de código:
resultado:
fonte
Acho que vocês estão misturando conceitos. Polimorfismo é a capacidade de um objeto se comportar de maneira diferente em tempo de execução. Para conseguir isso, você precisa de dois requisitos:
Dito isto, sobrecarregar significa algo diferente de substituir, dependendo do idioma que você está usando. Por exemplo, em Java, não existe substituição, mas sobrecarga . Métodos sobrecarregados com assinatura diferente de sua classe base estão disponíveis na subclasse. Caso contrário, eles seriam substituídos (por favor, veja que agora quero dizer que não há como chamar seu método de classe base de fora do objeto).
No entanto, em C ++ não é assim. Qualquer método sobrecarregado , independentemente de a assinatura ser a mesma ou não (quantidade diferente, tipo diferente) também é substituído . Hoje, o método da classe base não está mais disponível na subclasse ao ser chamado de fora do objeto da subclasse, obviamente.
Portanto, a resposta é quando se fala em Java, use sobrecarga . Em qualquer outro idioma pode ser diferente, como acontece em c ++
fonte
Polimorfismo é mais provável na medida em que significa ... para SUBSTITUIR em java
Trata-se de um comportamento diferente do mesmo objeto em diferentes situações (na maneira de programar ... você pode chamar ARGUMENTOS diferentes)
Acho que o exemplo abaixo o ajudará a entender ... Embora não seja um código java PURO ...
Mas se mudarmos o ARGUMENTO ... o COMPORTAMENTO será alterado ...
A Pessoa (aqui o "Objeto") é a mesma ...
fonte
Polimorfismo é uma implementação múltipla de um objeto ou você pode dizer várias formas de um objeto. digamos que você tenha classe
Animals
como a classe base abstrata e ele tenha um método chamadomovement()
que define a maneira como o animal se move. Agora, na realidade, temos diferentes tipos de animais e eles se movem de maneira diferente, alguns com 2 pernas, outros com 4 e outros sem pernas, etc. Para definir diferentesmovement()
animais de cada terra, precisamos aplicar o polimorfismo. No entanto, você precisa definir mais classes, ou seja, classeDogs
Cats
Fish
etc. Em seguida, você precisa estender essas classes da classe baseAnimals
e substituir seu métodomovement()
por uma nova funcionalidade de movimento com base em cada animal que você possui. Você também pode usarInterfaces
para conseguir isso. A palavra-chave aqui é primordial, a sobrecarga é diferente e não é considerada polimorfismo. com sobrecarga, você pode definir vários métodos "com o mesmo nome", mas com parâmetros diferentes no mesmo objeto ou classe.fonte
Polimorfismo refere-se à capacidade de uma linguagem ter diferentes objetos tratados de maneira uniforme usando uma única interface; como tal, está relacionado à substituição, portanto a interface (ou a classe base) é polimórfica, o implementador é o objeto que substitui (duas faces da mesma medalha)
de qualquer maneira, a diferença entre os dois termos é melhor explicada usando outras linguagens, como c ++: um objeto polimórfico em c ++ se comporta como o equivalente em java se a função base for virtual, mas se o método não for virtual, o salto de código será resolvido estaticamente , e o tipo verdadeiro não verificado no tempo de execução, portanto, o polimorfismo inclui a capacidade de um objeto se comportar de maneira diferente, dependendo da interface usada para acessá-lo; deixe-me fazer um exemplo no pseudocódigo:
(supondo que makeRumor NÃO seja virtual)
java não oferece realmente esse nível de polimorfismo (também chamado de corte de objetos).
animal a = novo cachorro (); cachorro b = cachorro novo ();
em ambos os casos, apenas imprimirá woff .. uma vez que aeb está se referindo à classe dog
fonte
fonte