Polimorfismo – Defina em apenas duas sentenças

Eu olhei para outras definições e explicações e nenhuma delas me satisfaz. Eu quero ver se alguém pode definir o polymorphism em no máximo duas frases sem usar nenhum código ou exemplos. 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 compreensão muito boa do que é o polymorphism e tem um bom domínio do inglês, então deveria ser capaz de responder a essa pergunta em uma definição curta, embora densa. Se a sua definição define com precisão o polymorphism, mas é tão densa que requer algumas leituras, é exatamente isso 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ódigo. Procure aqui explicações (a resposta nessas páginas não é satisfatória para minha pergunta):

Polimorfismo vs Overriding vs Sobrecarga
Tente descrever o polymorphism o mais fácil possível

Por que estou fazendo esta pergunta? Porque me fizeram a mesma pergunta e descobri que não consegui chegar a uma definição satisfatória (pelos meus padrões, que são bem altos). Eu quero ver se alguma das grandes mentes deste site pode fazer isso.

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

O polymorphism permite a expressão de algum tipo de contrato, com potencialmente muitos tipos implementando esse contrato (seja por inheritance de class 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 (*) ter que se preocupar com qual implementação está envolvida, apenas que o contrato será obedecido.

(*) No caso ideal, de qualquer forma – obviamente, muitas vezes, o código de chamada escolheu a implementação apropriada muito deliberadamente!

As frutas podem ser consumidas, como regra geral, mas diferentes tipos de frutas são consumidos de diferentes maneiras. 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 uma maneira diferente da maçã. Você descasca primeiro.

Bem, pelo menos eu faço, mas sou estranho de alguma maneira, então o que eu sei.

Isso ilustra a inheritance (a fruta pode ser comida), o polymorphism (algo que come frutas podem comer todos os tipos de frutas) e o encapsulamento (uma banana tem uma casca).

Falando sério, inheritance de object, polymorphism, encapsulamento, coisas virtuais, coisas abstratas, coisas privadas, coisas públicas, todos são conceitos difíceis. Se alguém quiser ter uma definição de 2 frases, por favor marque a questão como uma variante de code-golf, porque duas dessas frases terão que ser tão concisas que, a menos que você saiba o que é, você não aprenderá o suficiente sobre para saber o que você precisa aprender mais.

O polymorphism está declarando uma interface uniforme que não é sensível ao tipo, deixando os detalhes da implementação para tipos concretos que implementam a interface.

Na verdade, existem várias formas de polymorphism e há bastante controvérsia sobre isso; você pode até ver professores de computação gráfica que não podem defini-lo corretamente. Eu estou ciente de três tipos:

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

  • polymorphism 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 ambos possuem um tamanho de function de membro).

  • polymorphism de subtipo (onde um tipo herda de outro tipo). Pode ser visto na maioria das linguagens de programação OO (por exemplo, Triangle is a Shape).

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

Eu realmente entendo, por que você está fazendo esta pergunta. Eu entendo polymorphism, mas eu estava em uma entrevista de emprego e fui solicitado a dar uma definição curta e clara do polymorphism. Porque eu não pude dar uma definição clara e curta, eu comecei a pensar sobre isso e aqui está minha definição:

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

Definição :

O polymorphism é uma palavra de US $ 10 para uma ideia de US $ 1 – que quando peço que algo seja feito, não me importa como isso é alcançado, desde que o resultado final seja apropriado. Desde 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 objects, o Polimorfismo é fundamentalmente um princípio do mundo real e deve ser definido em termos do mundo real, não em termos tecnológicos.

Exemplos

Quando eu quero fazer uma binding, eu pego um telefone, dismo um número e falo com a festa do outro lado. Eu não me importo com quem fez o telefone, que tecnologia ele usa, seja com fio, sem fio, celular ou VOIP, ou se está na garantia.

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

Múltiplas implementações da mesma interface.

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

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

Ok, isso é difícil …

O polymorphism é uma abstração de codificação de software em que várias entidades subjacentes diferentes (geralmente dados, mas sempre nit) compartilham uma interface comum que permite que elas sejam idênticas 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.

polymorphism == múltiplas classs + mesmas assinaturas de methods + comportamento específico de class.

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

Isso é bastante genérico, mas essa é a única maneira que eu posso pensar em envolver todos os três tipos de polymorphisms que eu conheço: ad hoc , paramétrico e subtipo . Eu irei em mais detalhes abaixo e classificarei os tipos de polymorphism por nome, alfabeticamente. O que você está interessado é provavelmente o polymorphism de subtipo , que é o último.

Polimorfismo ad hoc

O polymorphism ad hoc é o ato de fornecer implementações múltiplas 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 methods de format compartilham uma única interface , mas funcionam em entidades de diferentes tipos .

Polimorfismo paramétrico

O polymorphism paramétrico é o ato de fazer uma class (ou método) funcionar em um tipo que é em si um parâmetro da class (ou método). É muitas vezes referido como genéricos .

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

Note para os puristas que eu estou propositalmente ignorando tipos crus como eu sinto que eles apenas mudariam as águas neste contexto.

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

Polimorfismo de subtipo

O polymorphism 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: Animal fornece um contrato que todas as implementações devem respeitar. Dog é um Animal e, como tal, suporta todas as operações que Animal declara. De acordo com o princípio de substituição de Liskov , isso permite que você use uma instância de Dog onde uma instância de Animal é esperada (mas não o contrário).

Se Cat e Dog são ambas subclasss de Animal , eles compartilham uma única interface, mas na verdade são tipos diferentes .

Eu estou saindo um pouco de tangente aqui, mas o polymorphism de subtipo é (eu acho) o único que permite replace : o ato de redefinir o comportamento de um método definido por uma class pai. Isto é freqüentemente confundido com sobrecarga que, como vimos antes, é um tipo de polymorphism e não precisa de subclasss (nem precisa de classs, na verdade).

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 polymorphism:

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

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

 2. Run time or (dynamic) polymorphism. 

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

Mas na terminologia .NET, apenas o segundo ( quero dizer polymorphism do tempo de execução ) é realmente suposto como polymorphism e simplesmente chamado de polymorphism .

E, tanto quanto sei, existem três methods para implementar o polymorphism ( 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 polymorphism 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 mobileList = new List(); 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(); } } 

Saída:

  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: 

Múltiplas formas de um único object é chamado de polymorphism.

Polimorfismo é a capacidade de um object para aparecer e se comportar de maneira diferente para a mesma invocação. ex: cada animal aparece e soa diferente (quando você acerta)

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

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

Polimorfismo

Objetos diferentes podem responder à mesma mensagem de maneiras diferentes, permitindo que os objects interajam uns com os outros sem conhecer seu tipo exato.

Via: http://www.agiledata.org/essays/objectOrientation101.html

Essa é a definição que eu sempre segui:

Dois objects são polimórficos (com respeito a um protocolo particular) entre eles, se ambos respondem às mesmas mensagens com a mesma semântica.

Polimorfismo é sobre mensagens, é sobre poder responder o mesmo conjunto de mensagens com a mesma semântica.

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

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

Polimorfismo é um recurso de programação que permite que um object tenha muitos tipos (‘formas’) e permite tratá-lo como qualquer um desses tipos, dependendo do que você precisa fazer sem conhecer ou se importar com seus outros tipos.

O polymorphism é uma funcionalidade de linguagem que permite que códigos algorítmicos de alto nível operem inalterados em vários tipos de dados. E a outra sentença, o que quer que fosse para …; -P.

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

O conceito de polymorphism tornou-se um fenômeno ultimamente. Aqui está o desvio real. Tempo de Execução define qual método deve ser invocado por uma referência de uma superclass. Agora, o que significa na prática? Isso significa realmente nada. Você pode codificar simplesmente sem polymorphism. Então por que? Porque, se não tivermos o polymorphism, tivemos que memorizar todas as definições das funções da subclass. O polymorphism nos salva disso na prática.

Você pode definir uma lista da seguinte maneira:

 List list = new List(); 

mas se você verificar por IList , você pode se beneficiar da interface como:

 IList list = new List(); 

e use a referência IList livremente. Supondo que o IList também é implementado em outra class, você pode usar methods dessa class desconhecida via novamente a referência IList sem tentar lembrar o nome dessa class. Maravilhoso, não é?

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

Além disso, existem 2 regras integrais no polymorphism. Uma é inheritance (via interface impl. Ou via class extending) e a outra é predominante. Sem ignorar, o polymorphism não existe. Observe que a sobrecarga de método (que sempre em uma única class) também é um tipo de polymorphism “minimalista”.

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

Polimorfismo é a habilidade de usar classs diferentes que implementam uma interface comum (ou estendem uma class base comum) de uma maneira comum, sem precisar agora da implementação específica, e usando apenas os methods 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 qual variável foi instanciada como ArrayList ou LinkedList.

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

Eu acho que a implementação de methods da mesma assinatura em classs diferentes (tendo algum tipo de relação de inheritance usando extensões ou implementos) é um método que substitui e também polymorphism porque desta forma estamos alcançando muitas formas da mesma assinatura de método.

Eu acho que às vezes os objects são chamados dinamicamente. Você não tem certeza se o object seria um triângulo, quadrado, etc em um formato clássico poli. exemplo.

Então, para deixar todas essas coisas para trás, apenas chamamos a function de class derivada e assumimos que a class dinâmica será chamada.

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

Polimorfismo é a capacidade de uma function se adaptar automaticamente para aceitar dados de input de diferentes tipos de dados. Você pode ‘Adicionar’ dois duplos ‘1.1’ e ‘2.2’ e obter ‘3.3’ ou ‘Adicionar’ duas strings “Stack” e “Overflow” e obter “StackOverflow”.

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