Domanda

Ho esaminato altre definizioni e spiegazioni e nessuna di esse mi soddisfa. Voglio vedere se qualcuno può definire il polimorfismo in al massimo due frasi senza usare alcun codice o esempio. Non voglio sentire "Quindi hai una persona / macchina / apriscatole ..." o come viene derivata la parola (nessuno è impressionato dal fatto che tu sappia cosa significano poli e morph). Se hai un'ottima conoscenza di cosa sia il polimorfismo e hai una buona padronanza dell'inglese di quanto dovresti essere in grado di rispondere a questa domanda in una definizione breve, sebbene densa. Se la tua definizione definisce accuratamente il polimorfismo ma è così densa da richiedere un paio di rilievi, questo è esattamente quello che sto cercando.

Perché solo due frasi? Perché una definizione è breve e intelligente. Una spiegazione è lunga e contiene esempi e codice. Guarda qui le spiegazioni (la risposta su quelle pagine non è soddisfacente per la mia domanda):

Polimorfismo vs Override vs Overloading
Prova a descrivere il polimorfismo nel modo più semplice possibile

Perché sto ponendo questa domanda? Perché mi è stata posta la stessa domanda e ho scoperto che non ero in grado di elaborare una definizione soddisfacente (secondo i miei standard, che sono piuttosto elevati). Voglio vedere se una delle grandi menti di questo sito può farlo.

Se non riesci davvero a rendere il requisito delle due frasi (è un argomento difficile da definire), va bene se vai oltre. L'idea è quella di avere una definizione che in realtà definisce cos'è il polimorfismo e non spiega cosa fa o come usarlo (capire la differenza?).

È stato utile?

Soluzione

Il polimorfismo consente l'espressione di una sorta di contratto, con potenzialmente molti tipi che implementano quel contratto (sia attraverso l'eredità di classe o meno) in modi diversi, ciascuno secondo il proprio scopo. Il codice usando quel contratto non dovrebbe (*) preoccuparsi di quale implementazione sia coinvolta, solo che il contratto sarà rispettato.

(*) Nel caso ideale, comunque - ovviamente abbastanza spesso il codice chiamante ha scelto deliberatamente l'implementazione appropriata!

Altri suggerimenti

La frutta può essere consumata, come regola generale, ma diversi tipi di frutta vengono consumati in modi diversi. Una mela, che è un frutto, può essere mangiata (perché è un frutto). Una banana può anche essere mangiata (perché è anche un frutto), ma in modo diverso da una mela. Lo sbucci prima.

Beh, almeno lo faccio, ma sono strano in alcune maniere, quindi che ne so.

Questo illustra l'eredità (la frutta può essere mangiata), il polimorfismo (qualcosa che mangia la frutta può mangiare tutti i tipi di frutta) e l'incapsulamento (una banana ha una buccia).

Scherzi a parte, eredità dell'oggetto, polimorfismo, incapsulamento, cose virtuali, cose astratte, cose private, cose pubbliche, questi sono tutti concetti concreti. Se qualcuno vuole assolutamente avere una definizione di 2 frasi di questo, per favore tagga la domanda come una variante di code-golf, perché due di queste frasi dovranno essere così concise che a meno che tu non sappia di cosa si tratta già non imparerai abbastanza per sapere di cosa hai bisogno per saperne di più.

Il polimorfismo sta dichiarando un'interfaccia uniforme che non è a conoscenza del tipo, lasciando i dettagli dell'implementazione a tipi concreti che implementano l'interfaccia.

In realtà, ci sono molteplici forme di polimorfismo e ci sono alcune controversie al riguardo; potresti persino vedere professori CS che non riescono a definirlo correttamente. Sono a conoscenza di tre tipi:

  • polimorfismo ad hoc (sembra un'anatra e cammina come un'anatra = > è un'anatra). Può essere visto in Haskell e Python per esempio.

  • polimorfismo generico (dove un tipo è un'istanza di un tipo generico). Può essere visto in C ++ per esempio (il vettore di int e il vettore di stringa hanno entrambi una dimensione di funzione membro).

  • Polimorfismo del sottotipo
  • (dove un tipo eredita da un altro tipo). Può essere visto nella maggior parte dei linguaggi di programmazione OO (ovvero Triangle is a Shape).

Wikipedia: il polimorfismo è una funzione del linguaggio di programmazione che consente di gestire valori di diversi tipi di dati utilizzando un'interfaccia uniforme. Abbastanza semplice per me.

Capisco davvero, perché stai ponendo questa domanda. Capisco il polimorfismo, ma ero a un colloquio di lavoro e mi è stato chiesto di dare una definizione breve e chiara del polimorfismo. Perché non potevo dare una definizione chiara e breve, ho iniziato a pensarci ed ecco la mia definizione:

La capacità degli oggetti di un tipo di avere un'unica interfaccia, ma un'implementazione diversa di questa interfaccia.

Definizione :

Polimorfismo è una parola da $ 10 per un'idea da $ 1 - che quando chiedo qualcosa da fare, non mi interessa come viene raggiunto fino a quando il risultato finale è appropriato. Finché il servizio è fornito correttamente, non mi interessa della implementazione .

Discussione

Sebbene sia comunemente usato nello sviluppo di software, specialmente nei sistemi sviluppati seguendo principi orientati agli oggetti, il polimorfismo è fondamentalmente un principio del mondo reale e dovrebbe essere definito in termini del mondo reale, non tecnologici.

Esempi

Quando voglio fare una telefonata, prendo un telefono, compongo un numero e parlo con l'interlocutore all'altro capo. Non mi interessa chi ha realizzato il telefono, quale tecnologia utilizza, che sia cablata, wireless, mobile o VOIP o se è in garanzia.

Quando voglio stampare un documento, lo stampo. Non mi interessa il linguaggio di implementazione, il marchio della stampante, lo stile di connessione, la scelta del materiale di consumo o la qualità della carta.

Implementazioni multiple della stessa interfaccia.

Esempio: molti modelli di telefono implementano l'interfaccia del tastierino numerico.

Il polimorfismo è una strategia orientata agli oggetti utilizzata durante la progettazione di modelli di oggetti, per semplificare il codice. Al suo centro il polimorfismo è la capacità di definire due oggetti similari ma diversi, e quindi di trattare i due oggetti come se fossero gli stessi.

Ok, è difficile ....

Ho solo pensato di aggiungere la mia interpretazione di cosa sia il polimorfismo: molto genericamente, il polimorfismo è l'atto di fornire una interfaccia singola a entità di tipi diversi .

È piuttosto generico, ma è l'unico modo a cui riesco a pensare di avvolgere tutti e tre i tipi di polimorfismi che conosco: ad hoc , parametrico e sottotipo . Vado più in dettaglio di seguito e ho ordinato i tipi di polimorfismo per nome, in ordine alfabetico. Quello a cui sei interessato è molto probabilmente il polimorfismo del sottotipo , che è l'ultimo.

Polimorfismo ad hoc

Polimorfismo ad hoc è l'atto di fornire molteplici implementazioni dello stesso metodo per diversi tipi di parametri. In OOP , è generalmente noto come overloading del metodo . Ad esempio:

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);
}

Entrambi i metodi format condividono una singola interfaccia , ma funzionano su entità di tipi diversi .

Polimorfismo parametrico

Polimorfismo parametrico è l'atto di far funzionare una classe (o metodo) su un tipo che è esso stesso un parametro della classe (o metodo). Viene spesso chiamato generici .

Ad esempio, List [T] di Java prevede un parametro T al momento dell'istanza e questo parametro definisce il tipo di oggetto risultante.

Nota per i puristi che sto intenzionalmente ignorando i tipi grezzi poiché sento che in questo contesto avrebbero semplicemente confuso le acque.

List [String] e List [Date] condividono una singola interfaccia , ma lavorano su (e sono) tipi diversi .

Polimorfismo di sottotipo

Polimorfismo dei sottotipi è probabilmente ciò che inizialmente intendevi nella tua domanda: è l'atto di fornire una singola interfaccia a più implementazioni dello stesso tipo.

Per usare l'esempio consueto: Animal fornisce un contratto che tutte le implementazioni devono rispettare. Dog è un Animal e come tale supporta tutte le operazioni dichiarate da Animal . Secondo il principio di sostituzione di Liskov , ciò consente di utilizzare un'istanza di Dog dove è prevista un'istanza di Animal (ma non viceversa).

Se Cat e Dog sono entrambi sottoclassi di Animal , allora condividono una interfaccia singola ma sono in infatti tipi diversi .

Sto andando in un po 'di tangente qui, ma il polimorfismo del sottotipo è (penso) l'unico che consente scavalcando : l'atto di ridefinire il comportamento di un metodo definito da un classe genitore. Questo è spesso confuso con sovraccarico che, come abbiamo visto prima, è un tipo di polimorfismo e in realtà non ha bisogno di sottoclassi (né ha bisogno di classi, davvero).

Il polimorfismo è un'astrazione di codifica software in cui diverse entità sottostanti (di solito dati, ma sempre nit) condividono un'interfaccia comune che consente loro di apparire e agire identici in fase di esecuzione. Usiamo questo come una tecnica di sviluppo per imporre comportamenti coerenti su una vasta gamma di istanze simili, ma non identiche, con un'implementazione minima assoluta, riducendo così le aspettative di bug e incongruenze.

Paul.

polimorfismo == classi multiple + firme dello stesso metodo + comportamento specifico della classe.

Sembra che qui vengano fornite le migliori definizioni, quindi vorrei aggiungere i miei due centesimi per favore, solo per altri osservatori. Spero che possa aiutare di più.

Esistono due tipi di polimorfismo:

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

Questo è semplicemente il metodo di sovraccarico e sovraccarico dell'operatore

2.  Run time or (dynamic) polymorphism.

Il primo termine è ereditato dalla terminologia Java e C ++.

Ma nella terminologia .NET solo la seconda ( intendo polimorfismo del tempo di esecuzione ) è davvero supposto come polimorfismo e semplicemente chiamato polimorfismo .

E per quanto ne so ci sono tre metodi per implementare ( tempo di esecuzione ) polimorfismo .

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

 2. Inheritance-based polymorphism or subtyping.

 3. Interface-based polymorphism.

Un semplice esempio di polimorfismo basato su interfaccia:

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();
    }
}

Output:

 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:

Le forme multiple di un singolo oggetto sono chiamate polimorfismo.

Il polimorfismo è la capacità di un oggetto di apparire e comportarsi diversamente per la stessa invocazione. es: ogni animale appare e suona in modo diverso (quando lo colpisci :))

Il polimorfismo è una caratteristica dei linguaggi di programmazione che consente a un oggetto di essere trattato come un'istanza del suo supertipo.

Dare un singolo nome a un insieme di operazioni analoghe su diversi tipi. Se fatto bene, l'analogia è ovvia, ad es. & Quot; aggiungere " numeri aritmetici e "aggiunta" stringhe per concatenazione (che ne somma la lunghezza).

Il polimorfismo

Oggetti diversi possono rispondere allo stesso messaggio in modi diversi, consentire agli oggetti di interagire tra loro senza conoscerne il tipo esatto.

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

Questa è la definizione che ho sempre seguito:

Due oggetti sono polimorfici (rispetto ad un protocollo particolare) tra loro, se entrambi rispondono agli stessi messaggi con lo stesso semantico.

Il polimorfismo riguarda i messaggi, riguarda la capacità di rispondere allo stesso insieme di messaggi con lo stesso semantico.

Se due oggetti POSSONO rispondere a vuoto? ma la semantica del messaggio è diversa, quindi ... non sono polimorfici.

Il polimorfismo al livello inferiore è la capacità di invocare metodi definiti dagli implementatori di un'interfaccia dall'istanza dell'interfaccia.

Il polimorfismo è una funzione di programmazione che consente a un oggetto di avere molti tipi ('forme') e ti consente di trattarlo come uno di quei tipi a seconda di ciò che devi fare senza conoscere o preoccuparti degli altri tipi.

Il polimorfismo è una funzionalità linguistica che consente al codice algoritmico di alto livello di operare invariato su più tipi di dati. E l'altra frase, qualunque cosa fosse per ... ;-P.

(I tipi supportati da C ++ sono elencati e contrastati nella mia risposta: Polimorfismo in c ++ )

Il concetto di polimorfismo è diventato un fenomeno ultimamente. Ecco la deriva reale. Il runtime definisce quale metodo secondario deve essere invocato da un riferimento di una super classe. Ora, cosa significa in pratica? In realtà non significa nulla. Puoi codificare semplicemente senza polimorfismo. Allora perchè? Perché, se non abbiamo il polimorfismo, abbiamo dovuto memorizzare tutte le definizioni delle funzioni della sottoclasse. Il polimorfismo ci salva da questo in pratica.

Puoi definire un elenco come segue:

List list = new List();

ma se cerchi IList , puoi beneficiare dell'interfaccia come:

IList list = new List();

e usa liberamente il riferimento IList . Supponendo che IList sia implementato anche in un'altra classe, è possibile utilizzare i metodi di quella classe sconosciuta tramite nuovamente il riferimento IList senza cercare di ricordare quel nome di classe. Meraviglioso, vero?

Ora stanno arrivando informazioni più preziose:
Java è di default polimorfico, mentre .NET e C ++ non lo sono, in MS, devi dichiarare la funzione di base virtual (e in .NET override keyword).

Inoltre, ci sono 2 regole integrali nel polimorfismo. Uno è l'ereditarietà (tramite l'interfaccia dell'interfaccia o tramite l'estensione della classe) e l'altro è prioritario. Senza ignorare, il polimorfismo non esiste. Si noti che il sovraccarico del metodo (che sempre in una singola classe) è anche un tipo di "minimalista" polimorfismo.

Per una data firma del metodo, vengono eseguite diverse implementazioni del metodo per classi diverse, gerarchicamente correlate.

Il polimorfismo è la capacità di utilizzare classi diverse che implementano un'interfaccia comune (o estendono una classe base comune) in modo comune, senza la necessità di un'implementazione specifica e l'utilizzo solo dei metodi disponibili nell'interfaccia comune.

Vale a dire: in Java, poiché ArrayList e LinkedList implementano entrambi List, se si dichiara una variabile come List, è sempre possibile eseguire le operazioni consentite in List, indipendentemente dal fatto che se la variabile è stata istanziata come ArrayList o LinkedList.

Entità dello stesso tipo (ovvero implementate la stessa interfaccia o derivate dalla stessa classe), si comportano in modi diversi (con lo stesso nome di metodo).

Penso che l'implementazione di metodi della stessa firma in classi diverse (avere una sorta di relazione ereditaria sia usando estensioni che implementa) sia il metodo prevalente e anche il polimorfismo perché in questo modo stiamo ottenendo molte forme della stessa firma del metodo.

Immagino che a volte gli oggetti vengano chiamati dinamicamente. Non sei sicuro che l'oggetto sia un triangolo, un quadrato ecc. In una poli di forma classica. esempio.

Quindi, per lasciarci alle spalle tutte queste cose, chiamiamo semplicemente la funzione della classe derivata e supponiamo che verrà chiamata quella della classe dinamica.

Non ti importerebbe se si tratta di un quadrato, un triangolo o un rettangolo. Ti interessa solo l'area. Quindi il metodo getArea verrà chiamato in base all'oggetto dinamico passato.

Il polimorfismo è la capacità di una funzione di adattarsi automaticamente per accettare dati di input di diversi tipi di dati. Puoi "Aggiungi" due doppi "1.1" e "2.2" e ottenere "3.3" o "Aggiungi" due stringhe " Stack " e " Overflow " e ottieni " StackOverflow " ;.

Il polimorfismo è quando oggetti diversi rispondono allo stesso metodo in modo diverso. Ad esempio, un'auto si muove sulla strada mentre una persona cammina sulla strada. Sono due oggetti che rispondono alla stessa strada in modo diverso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top