Polimorfismo - Definir em apenas duas frases [fechado]

85

Eu olhei para outras definições e explicações e nenhuma delas me satisfaz. Quero ver se alguém pode definir polimorfismo em no máximo duas frases sem usar nenhum código ou exemplo. Eu não quero ouvir 'Então você tem uma pessoa / carro / abridor de latas ...' ou como a palavra é derivada (ninguém está impressionado que você saiba o que significa poli e metamorfose). Se você tem uma boa compreensão do que é polimorfismo e tem um bom domínio do inglês, então você deve ser capaz de responder a esta pergunta em uma definição curta, embora densa. Se sua definição define polimorfismo com precisão, mas é tão densa que exige algumas leituras, então é exatamente o que estou procurando.

Por que apenas duas frases? Porque uma definição é curta e inteligente. Uma explicação é longa e contém exemplos e códigos. Procure aqui as explicações (as respostas nessas páginas não são satisfatórias para a minha pergunta):

Polimorfismo vs. Substituição vs. Sobrecarga
Tente descrever o polimorfismo o mais fácil que puder

Por que estou fazendo essa pergunta? Porque me fizeram a mesma pergunta e descobri que não era capaz de chegar a uma definição satisfatória (pelos meus padrões, que são bastante elevados). Eu quero ver se alguma das grandes mentes neste site pode fazer isso.

Se você realmente não pode fazer o requisito de duas frases (é um assunto difícil de definir), então está tudo bem se você continuar. A ideia é ter uma definição que realmente defina o que é polimorfismo e não explique o que ele faz ou como usá-lo (entendeu a diferença?).

Mark Testa
fonte
Um nome, implementação múltipla.
Prosunjit Biswas
2
Eu recebi essa pergunta em uma entrevista de emprego. Achei que fazer isso em uma entrevista de emprego era um ato elitista de esnobismo, o tipo de coisa que um funcionário do Google perguntaria presunçosamente, supondo que ninguém pudesse responder com eficácia. Se você não conseguiu o emprego porque não sabia responder, provavelmente é melhor trabalhar para pessoas que estão mais interessadas no que você pode fazer do que em quem você pode enganar.
MagicLAMP
O polimorfismo é um conceito muito importante para entender no desenvolvimento. Eu recomendo fortemente pelo menos entender seu valor, se não a definição formal. Sugiro ser capaz de explicar pelo menos como funciona o padrão Strategy e seu valor.
Chad Johnson

Respostas:

106

O polimorfismo permite a expressão de algum tipo de contrato, com potencialmente muitos tipos implementando esse contrato (seja por herança de classe ou não) de maneiras diferentes, cada um de acordo com seu próprio propósito. O código que usa esse contrato não deve (*) se preocupar com a implementação envolvida, apenas que o contrato será obedecido.

(*) No caso ideal, de qualquer maneira - obviamente, com bastante frequência, o código de chamada escolheu a implementação apropriada deliberadamente!

Jon Skeet
fonte
1
Mark, em algum momento você aceitou essa resposta e depois a não aceitou? Estou tentando descobrir o que parece ser um bug no sistema de reputação - essa resposta me deu uma rede de -15 repetições para hoje, estranhamente.
Jon Skeet
O mesmo aqui, Jon - agora aceitei 2 respostas com -15 repetições. Não que eu me importe, mas é intrigante.
Otávio Décio
3
A rigor, não há exigência de que "um tipo expresse algum tipo de contrato". Tudo o que é realmente necessário é que várias implementações possam responder à mesma mensagem sem que o remetente da mensagem precise saber ou se preocupar com qual implementação está lidando com a mensagem.
Doug Knesek
3
@ Doug: Se não houver contrato, mesmo implícito por meio de documentação ou nomenclatura, como você sabe que vai fazer o que você quer? Você fala sobre uma "interface" em sua própria resposta - o que me parece muito com um contrato - o que você vê como a diferença? Tanto "interface" quanto "contrato" são palavras que podem ser usadas em um sentido "forte" (por exemplo, aplicado em tempo de compilação) ou muito vagamente (por exemplo, por convenção de nomenclatura e usando tipagem dinâmica).
Jon Skeet
1
@Alex: Sim, seria uma edição que eu reverteria - prefiro minhas palavras. Você sempre pode adicionar sua própria resposta.
Jon Skeet de
72

Frutas podem ser comidas, como regra geral, mas diferentes tipos de frutas são consumidos de maneiras diferentes. Uma maçã, que é uma fruta, pode ser comida (porque é uma fruta). Uma banana também pode ser comida (porque também é uma fruta), mas de maneira diferente de uma maçã. Você o descasca primeiro.

Bem, pelo menos eu faço, mas sou estranho em alguns modos, então o que eu sei.

Isso ilustra herança (frutas podem ser comidas), polimorfismo (algo que come frutas pode comer todos os tipos de frutas) e encapsulamento (uma banana tem casca).

Falando sério, herança de objetos, polimorfismo, encapsulamento, coisas virtuais, coisas abstratas, coisas privadas, coisas públicas, todos esses são conceitos difíceis. Se alguém deseja absolutamente ter uma definição de 2 frases para isso, marque a pergunta como uma variante do código de golfe, porque duas dessas frases terão que ser tão concisas que, a menos que você saiba o que é, não aprenderá o suficiente sobre para saber o que você precisa saber mais.

Lasse V. Karlsen
fonte
lassevk: "a menos que você já saiba o que é, não aprenderá o suficiente sobre ele para saber o que precisa para aprender mais sobre" << Só para esclarecer, é isso que estou esperando. Estou procurando uma definição que pode exigir algum pensamento para ser entendida. Não aquele que seria usado para ensinar um iniciante.
Mark Testa
2
Percebi isso, acabei de postar uma resposta um tanto humorística (pelo menos para mim) :) Polimorfismo e OOP é uma daquelas grandes paredes, onde se você representar graficamente a curva de aprendizado, você atinge uma grande parede e rasteja sobre ela , ou você não. Se o fizer, geralmente terá um grande AHA! experiência ...
Lasse V. Karlsen
8
A cicuta também é uma fruta! Você pode comer, mas apenas uma vez!
James Anderson,
@JamesAnderson Então, um singleton?
Lasse V. Karlsen
47

Polimorfismo é declarar uma interface uniforme que não reconhece o tipo, deixando os detalhes de implementação para tipos concretos que implementam a interface.

Eran Galperin
fonte
Isso é incrivelmente sucinto e acho que se encaixa perfeitamente
Alex W
21

Wikipedia: Polimorfismo é um recurso de linguagem de programação que permite que valores de diferentes tipos de dados sejam tratados usando uma interface uniforme. Muito simples para mim.

Otávio Décio
fonte
21

Na verdade, existem várias formas de polimorfismo e há bastante controvérsia sobre isso; você pode até ver professores de ciência da computação que não conseguem defini-lo adequadamente. Estou ciente de três tipos:

  • polimorfismo ad-hoc (parece um pato e anda como um pato => é um pato). Pode ser visto em Haskell e Python, por exemplo.

  • polimorfismo genérico (onde um tipo é uma instância de algum tipo genérico). Pode ser visto em C ++, por exemplo (vetor de int e vetor de string têm um tamanho de função de membro).

  • polimorfismo de subtipo (onde um tipo herda de outro tipo). Pode ser visto na maioria das linguagens de programação OO (ou seja, Triangle é uma forma).


fonte
2
1 por mencionar que existem diferentes tipos de polimorfismo. No entanto, sua definição de polimorfismo ad-hoc parece ser bem diferente daquela mencionada em en.wikipedia.org/wiki/Type_polymorphism . Essa página diz que existem 2 tipos (ad-hoc versus paramétrico), não 3, e também faz uma distinção entre funções polimórficas e tipos de dados polimórficos. Seus 3 tipos, até onde posso determinar, correspondem a funções polimórficas paramétricas, tipos de dados polimórficos paramétricos e funções polimórficas ad-hoc, respectivamente.
Laurence Gonsalves
oi, qual é a diferença entre "instância de algum tipo genérico" e "herda de outro tipo" que parecem dizer a mesma coisa?
Shanimal
@LaurenceGonsalves fwiw, o link fornecido no primeiro comentário aponta para três tipos. Polimorfismo paramétrico é definido como permitir que uma função ou um tipo de dados seja escrito "genericamente".
Shanimal
14

Eu realmente entendo porque você está fazendo esta pergunta. Eu entendo polimorfismo, mas estava em uma entrevista de emprego e fui convidado a dar uma definição curta e clara de polimorfismo. Porque eu não conseguia dar uma definição clara e curta, comecei a pensar sobre isso e aqui está a minha definição:

A capacidade de objetos de um tipo terem uma e a mesma interface, mas diferentes implementações dessa interface.

Nikolay Traykov
fonte
10

Definição :

Polimorfismo é uma palavra de $ 10 para uma ideia de $ 1 - que quando eu peço que algo seja feito, não me importo como isso seja alcançado, desde que o resultado final seja apropriado. Contanto que o serviço seja fornecido corretamente, não me importo com a implementação .

Discussão

Embora seja comumente usado no desenvolvimento de software, especialmente em sistemas desenvolvidos seguindo princípios orientados a objetos, o polimorfismo é fundamentalmente um princípio do mundo real e deve ser definido em termos do mundo real, não tecnológicos.

Exemplos

Quando eu quero fazer uma ligação, pego o telefone, disco um número e falo com a pessoa do outro lado da linha. Eu não me importo com quem fez o telefone, qual tecnologia ele usa, se é com fio, sem fio, móvel ou VOIP, ou se está na garantia.

Quando quero imprimir um documento, eu o imprimo. Não me importo com a linguagem de implementação, marca da impressora, estilo de conexão, escolha de consumível ou qualidade do papel.

Bevan
fonte
5
soa como um exemplo de Encapsulationpara mim
Singleton
1
Polimorfismo, encapsulamento e abstração estão todos intimamente relacionados, embora se concentrem em perspectivas diferentes. Boas abstrações tornam o polimorfismo mais fácil de alcançar, e um bom encapsulamento ajuda a evitar o "vazamento" de detalhes.
Bevan
10

Várias implementações da mesma interface.

Exemplo: Muitos modelos de telefone implementam a interface do teclado numérico.

Doug Knesek
fonte
8

O polimorfismo é uma estratégia orientada a objetos usada ao projetar modelos de objetos, para ajudar a simplificar o código. Em seu polimorfismo central está a capacidade de definir dois objetos semelhantes, porém diferentes, e então tratar os dois objetos como se fossem iguais.

Ok, isso é difícil ....

JoshBerke
fonte
7

Eu apenas pensei em adicionar minha própria interpretação do que é polimorfismo: muito genericamente, polimorfismo é o ato de fornecer uma única interface para entidades de diferentes tipos .

Isso é bastante genérico, mas é a única maneira que consigo pensar de envolver todos os três tipos de polimorfismos que conheço: ad hoc , paramétrico e subtipo . Entrarei em mais detalhes abaixo e classificarei os tipos de polimorfismo por nome, em ordem alfabética. Aquele em que você está interessado é provavelmente o polimorfismo de subtipo , que é o último.

Polimorfismo ad hoc

Polimorfismo ad hoc é o ato de fornecer várias implementações do mesmo método para diferentes tipos de parâmetros. Em OOP , geralmente é conhecido como sobrecarga de método . Por exemplo:

public String format(int a) {
    return String.format("%2d", a);
}

public String format(Date a) {
    return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'").format(a);
}

Ambos os formatmétodos compartilham uma única interface , mas funcionam em entidades de tipos diferentes .

Polimorfismo paramétrico

Polimorfismo paramétrico é o ato de fazer uma classe (ou método) funcionar em um tipo que é ele mesmo um parâmetro da classe (ou método). Muitas vezes é referido como genérico .

Por exemplo, o Java List[T]espera um parâmetro Tno momento da instanciação e esse parâmetro define o tipo do objeto resultante.

Observe para os puristas que estou ignorando propositalmente os tipos crus, pois sinto que eles apenas turvariam as águas neste contexto.

List[String]e List[Date]compartilham uma única interface , mas funcionam (e são) tipos diferentes .

Polimorfismo de subtipo

Polimorfismo de subtipo é provavelmente o que você quis dizer inicialmente em sua pergunta: é o ato de fornecer uma única interface para várias implementações do mesmo tipo.

Para usar o exemplo habitual: Animalfornece um contrato que todas as implementações devem respeitar. Dogé um Animale, como tal, suporta todas as operações que Animaldeclara. De acordo com o princípio de substituição de Liskov , isso permite que você use uma instância de Dogonde uma instância de Animalé esperada (mas não o contrário).

Se Cate Dogforem subclasses de Animal, então eles compartilham uma única interface, mas na verdade são tipos diferentes .

Estou saindo um pouco tangente aqui, mas o polimorfismo de subtipo é (eu acho) o único que permite sobrescrever : o ato de redefinir o comportamento de um método definido por uma classe pai. Muitas vezes, isso é confundido com sobrecarga que, como vimos antes, é um tipo de polimorfismo e não precisa de subclasse (nem de classes, na verdade).

Nicolas Rinaudo
fonte
e o polimorfismo baseado em interface?
siamak
@siamak isso não é apenas um tipo específico de polimorfismo de subtipo onde o tipo pai é inteiramente abstrato? Ou você quer dizer outra coisa?
Nicolas Rinaudo,
Minha intenção de interface é Interface como um tipo de referência que existe em linguagens orientadas a objetos, como este: Interface I1 {void M ();} Eu acredito que existem tantas diferenças entre subtipo ou polimorfismo baseado em herança e polimorfismo baseado em interface . Porque há um relacionamento "É-um" no polimorfismo baseado em herança entre os tipos, mas não existe no polimorfismo baseado em Interface. Na verdade, um mesmo comportamento com diferentes implementações pode ser compartilhado entre vários tipos (classes) diferentes
siamak,
Devo admitir que estou confuso - além de sua abordagem um tanto balística para maiúsculas, parece que sua descrição do que você chama de polimorfismo baseado em interface é precisamente a mesma que minha descrição de polimorfismo de subtipo. Tenho certeza de que você vê a diferença, mas temo que não esteja realmente claro para mim.
Nicolas Rinaudo,
Como você pode ver, não há relação entre o carro, o pássaro e a pessoa, mas eles podem se mover à sua maneira. Há uma tremenda diferença entre a classe Abstract e Interface e usar interface não é o mesmo que subtipagem, então, na minha opinião, o polimorfismo de herança e o polimorfismo baseado em interface não são as mesmas coisas e não são iguais. // é difícil, codificação no segmento de comentários //
siamak
6

Parece que as melhores definições são fornecidas aqui, então deixe-me adicionar meus dois centavos , por favor, apenas para outros observadores. Espero que possa ajudar mais.

Existem dois tipos de polimorfismo:

1. Compile-time (static) polymorphism or (ad hoc) polymorphism.

Isso é simplesmente sobrecarga de método e sobrecarga de operador

2.  Run time or (dynamic) polymorphism.

O primeiro termo é herdado da terminologia Java e C ++.

Mas na terminologia .NET, apenas o segundo ( refiro-me ao polimorfismo em tempo de execução ) é realmente considerado polimorfismo e simplesmente chamado de polimorfismo .

E, pelo que eu sei, existem três métodos para implementar o polimorfismo ( tempo de execução ) .

 1. Parametric polymorphism or simply the use of generics (templates in C++).

 2. Inheritance-based polymorphism or subtyping.

 3. Interface-based polymorphism.

Um exemplo simples de polimorfismo baseado em interface:

interface Imobile
{
    void Move();
}

class Person :Imobile
{
    public void Move() { Console.WriteLine("I am a person and am moving in my way."); }
}

class Bird :Imobile
{
    public void Move() { Console.WriteLine("I am a bird and am moving in my way."); }
}

class Car :Imobile
{
    public void Move() { Console.WriteLine("I am a car and am moving in my way."); }
}


class Program
{

    static void Main(string[] args)
    {
        // Preparing a list of objects
        List<Imobile> mobileList = new List<Imobile>();

        mobileList.Add(new Person());
        mobileList.Add(new Bird());
        mobileList.Add(new Car());

        foreach (Imobile mobile in mobileList)
        {
            mobile.Move();
        }

        // Keep the console open
        Console.WriteLine("Press any key to exit the program:");
        Console.ReadKey();
    }
}

Resultado:

 I am a person and am moving in my way.
 I am a bird and am moving in my way.
 I am a car and am moving in my way.
 Press any key to exit the program:
Siamak
fonte
Ainda não vejo a diferença que você faz. Pessoa, Pássaro e Carro são todos subtipos de Imóvel. A pessoa é um imóvel, o pássaro é um imóvel e o carro é um imóvel. Se você precisar de uma variável do tipo Imobile, poderá usar uma instância de Person, Bird ou Car, all digitaria check. Isso é precisamente o que significa polimorfismo de subtipo.
Nicolas Rinaudo
Bird e Person and Car não são subtipos de Imobile, eles são implementadores dessa interface e "percebem" essa interface em sua própria maneira. O termo "subtipo" é amplamente usado entre um tipo real e um subtipo real herdado dele, e nesta situação existe uma relação "É-um" entre eles, por exemplo, um cão é um subtipo de um mamífero.
siamak
do ponto de vista do compilador, fazer uma referência a uma interface e usar as referências é algo verdadeiro e correto. / MAS / IT não é um conceito igual a subtipagem em um relacionamento de herança. E eu acho que chamar os implementadores de uma interface como subtipos é tão estranho e realmente não é verdade.
siamak
Um exemplo de polimorfismo baseado em herança faria bem em explicar esta resposta.
Marcelo Mason
5

Polimorfismo é uma abstração de codificação de software em que várias entidades subjacentes diferentes (geralmente dados, mas nit sempre) compartilham uma interface comum que permite que pareçam e atuem de forma idêntica em tempo de execução. Usamos isso como uma técnica de desenvolvimento para impor um comportamento consistente em uma ampla gama de instâncias semelhantes, mas não idênticas, com uma implementação mínima absoluta, reduzindo assim a expectativa de bugs e inconsistências.

Paulo.

Paul W Homer
fonte
5

polimorfismo == classes múltiplas + assinaturas do mesmo método + comportamento específico da classe.

S.Lott
fonte
2

Várias formas de um único objeto são chamadas de polimorfismo.

milot
fonte
2

Polimorfismo é a capacidade de um objeto de aparecer e se comportar de maneira diferente para a mesma invocação. ex: cada animal parece e soa de forma diferente (quando você bate nele :))

Mallik
fonte
2

O polimorfismo é uma característica das linguagens de programação que permite que um objeto seja tratado como uma instância de seu supertipo.

TarkaDaal
fonte
Downvoter - Você poderia explicar por quê?
TarkaDaal
1

Dar um único nome a um conjunto de operações análogas em diferentes tipos. Quando bem feita, a analogia é óbvia, por exemplo, "adicionar" números aritmeticamente e "adicionar" strings por concatenação (que soma seus comprimentos).

joel.neely
fonte
1

Esta é a definição que sempre segui:

Dois objetos são polimórficos (com relação a um determinado protocolo) entre eles, se ambos respondem às mesmas mensagens com a mesma semântica.

Polimorfismo é sobre mensagens, é sobre ser capaz de responder ao mesmo conjunto de mensagens com a mesma semântica.

Se dois objetos PODEM responder ao vazio? mas a semântica da mensagem é diferente, então .. eles não são polimórficos.

Claudio Acciaresi
fonte
1

O polimorfismo no nível inferior é a capacidade de invocar métodos que são definidos pelos implementadores de uma interface da instância da interface.

Igor Zevaka
fonte
1

O polimorfismo é um recurso de programação que permite que um objeto tenha muitos tipos ('formas') e permite tratá-lo como qualquer um desses tipos, dependendo do que você precisa fazer, sem saber ou se preocupar com os outros tipos.

Jeff Sternal
fonte
1

Polimorfismo é a funcionalidade da linguagem que permite que um código algorítmico de alto nível opere inalterado em vários tipos de dados. E a outra frase, seja lá o que for ... ;-P.

(Os tipos suportados por C ++ são listados e contrastados em minha resposta: Polimorfismo em c ++ )

Tony Delroy
fonte
0

O conceito de polimorfismo se tornou um fenômeno recentemente. Aqui está a tendência real. O tempo de execução define qual submethod deve ser invocado por uma referência de uma superclasse. Agora, o que significa na prática? Na verdade, não significa nada. Você pode codificar simplesmente sem polimorfismo. Então por que? Porque, se não tivermos o polimorfismo, teríamos que memorizar todas as definições das funções da subclasse. O polimorfismo nos salva disso na prática.

Você pode definir uma lista da seguinte maneira:

List list = new List();

mas se você verificar IList, poderá se beneficiar da interface como:

IList list = new List();

e use a IListreferência livremente. Supondo que IListtambém esteja implementado em outra classe, você pode usar métodos dessa classe desconhecida por meio de IListreferência novamente sem tentar lembrar o nome da classe. Maravilhoso, não é?

Agora, informações mais valiosas estão chegando:
Java é por padrão polimórfico, enquanto .NET e C ++ não são, no MS, você deve declarar a função base virtual(e na overridepalavra-chave .NET ).

Além disso, existem 2 regras integrais no polimorfismo. Um é a herança (via implementação de interface ou via extensão de classe) e o outro é sobreposição. Sem substituir, o polimorfismo não existe. Observe que a sobrecarga de método (que sempre ocorre em uma única classe) também é um tipo de polimorfismo "minimalista".

jazziiilove
fonte
1
São mais de 2 frases.
Perigoso
0

Para uma determinada assinatura de método, diferentes implementações de método são executadas para diferentes classes hierarquicamente relacionadas.

Paolo
fonte
0

Polimorfismo é a capacidade de usar diferentes classes que implementam uma interface comum (ou estendem uma classe base comum) de uma forma comum, sem a necessidade de agora a implementação específica, e usando apenas os métodos disponíveis na interface comum.

Ou seja: Em Java, como ArrayList e LinkedList implementam List, se você declarar uma variável como List, você sempre pode executar as operações permitidas em List, não importando se sua variável foi instanciada como ArrayList ou LinkedList.

GaRRaPeTa
fonte
0

Entidades do mesmo tipo (ou seja, implementadas na mesma interface ou derivadas da mesma classe), se comportam de maneiras diferentes (sob o mesmo nome de método).

paul paul
fonte
0

Eu acho que a implementação de métodos da mesma assinatura em classes diferentes (tendo algum tipo de relação de herança usando extends ou implementa) é uma substituição de método e também polimorfismo, porque dessa forma estamos alcançando muitas formas da mesma assinatura de método.

anand
fonte
-2

Acho que às vezes os objetos são chamados dinamicamente. Você não tem certeza se o objeto seria um triângulo, quadrado etc. em um polígono clássico. exemplo.

Portanto, para deixar todas essas coisas para trás, apenas chamamos a função da classe derivada e assumimos que aquela da classe dinâmica será chamada.

Você não se importaria se fosse um quadrado, triângulo ou retângulo. Você só se preocupa com a área. Portanto, o método getArea será chamado dependendo do objeto dinâmico passado.

Kapil D
fonte
-2

Polimorfismo é a capacidade de uma função se adaptar automaticamente para aceitar dados de entrada de diferentes tipos de dados. Você pode 'Adicionar' dois duplos '1.1' e '2.2' e obter '3,3' ou 'Adicionar' duas strings "Pilha" e "Estouro" e obter "PilhaOverflow".

J-Dizzle
fonte
Por que alguém marcou isso - esta é a 'resposta literal' da página da Web da National Instrument sobre polimorfismo !!!
J-Dizzle
-3

Polimorfismo é quando objetos diferentes respondem ao mesmo método de maneira diferente. Por exemplo, um carro se move na estrada enquanto uma pessoa anda na estrada. Esses são dois objetos que respondem à mesma estrada de uma maneira diferente.

user2342589
fonte
Na verdade, o polimorfismo está vendo instâncias de classes diferentes como um tipo comum e sendo capaz de usar os métodos declarados neste tipo comum, independentemente de como as diferentes classes implementam esses métodos.
GaRRaPeTa