Che cos'è il polimorfismo, a cosa serve e come viene utilizzato?


564

Che cos'è il polimorfismo, a cosa serve e come viene utilizzato?


19
@Giovanni: +1 Sono d'accordo che sia un fenomeno molto interessante. Sono sicuro che Unkwntech non è l'unico individuo competente, capace di avere lacune in quello che gli altri considererebbero un vocabolario fondamentale. Va solo a mostrare che la programmazione è un argomento molto ampio.
AnthonyWJones,

9
Potrebbe usarlo, ma non dargli un nome.
Aiden Bell,

10
@Aamir: Non sono sicuro che sia ragionevole supporre che qualcuno con 8k conoscesse tutti i fondamenti in tutte le aree della programmazione. Inoltre, non credo che indichi che il sistema di reputazione sia imperfetto. Qualcuno può ottenere una notevole reputazione ponendo molte buone domande. Penso che la nostra risposta naturale a questa rivelazione dimostri semplicemente che noi (programmatori) abbiamo una naturale tendenza ad avere una mentalità un po 'ristretta (non una cosa negativa quando dobbiamo essere veramente bravi in ​​un'area tecnica specifica) e che ha i suoi lati negativi.
AnthonyWJones,

43
Sembra che abbiate una visione molto limitata della programmazione. Conosco ragazzi che stanno realizzando uno sviluppo integrato che non hanno alcuna conoscenza (o necessità) di concetti OO. Il loro obiettivo è quello di cancellare ogni ultimo atomo di prestazioni dal codice e basta: il codice su cui stanno lavorando non entrerà mai nel mondo degli oggetti, e fortunatamente sono abbastanza vicini al pensionamento di cui non devono preoccuparsi imparare concetti nuovi come oggetti, polimorfismo e nomi di variabili con più di due lettere :-)
paxdiablo,

29
Come si fa a imparare qualcosa? Nessuno è venuto in questo mondo conoscendo PHP OOP e modelli di progettazione, quindi tutti ad un certo punto hanno dovuto impararlo, al college, una risposta qui, ecc. Non parlare di qualcuno "non ha osato conoscere già procedure di codice complesse ", e considera invece che vogliono imparare, che è una buona cosa e il punto di questo sito. Usa il tuo tempo per aiutarli, poiché sono sicuro che sei stato aiutato in passato. Se nella storia dell'uomo, invece di condividere la conoscenza, la risposta fosse "Cosa? Ah! Non lo sai? .." saremmo ancora tutti nei secoli bui ..
James,

Risposte:


544

Se pensi alle radici greche del termine, dovrebbe diventare ovvio.

  • Poly = many: poligono = multi-faccia, polistirolo = molti stireni (a) , poliglotta = molte lingue e così via.
  • Morph = cambiamento o forma: morfologia = studio della forma biologica, Morpheus = il dio greco dei sogni in grado di assumere qualsiasi forma.

Quindi il polimorfismo è la capacità (nella programmazione) di presentare la stessa interfaccia per diverse forme sottostanti (tipi di dati).

Ad esempio, in molte lingue, numeri interi e float sono implicitamente polimorfici poiché è possibile aggiungere, sottrarre, moltiplicare e così via, indipendentemente dal fatto che i tipi siano diversi. Sono considerati raramente come oggetti nel solito termine.

Allo stesso modo, tuttavia, una classe come BigDecimalo Rationalo Imaginarypuò fornire tali operazioni, anche se operano su tipi di dati diversi.

L'esempio classico è la Shapeclasse e tutte le classi che possono ereditare da essa (quadrato, cerchio, dodecaedro, poligono irregolare, splat e così via).

Con il polimorfismo, ciascuna di queste classi avrà dati sottostanti diversi. Una forma a punti richiede solo due coordinate (supponendo che si trovi in ​​uno spazio bidimensionale ovviamente). Un cerchio ha bisogno di un centro e un raggio. Un quadrato o un rettangolo necessita di due coordinate per gli angoli in alto a sinistra e in basso a destra e (possibilmente) una rotazione. Un poligono irregolare necessita di una serie di linee.

Rendendo la classe responsabile del suo codice e dei suoi dati, puoi ottenere il polimorfismo. In questo esempio, ogni classe avrebbe la sua Draw()funzione e il codice client potrebbe semplicemente fare:

shape.Draw()

per ottenere il comportamento corretto per qualsiasi forma.

Ciò è in contrasto con il vecchio modo di fare cose in cui il codice era separato dai dati e avresti avuto funzioni come drawSquare()e drawCircle().

Orientamento agli oggetti, polimorfismo ed ereditarietà sono tutti concetti strettamente correlati e sono fondamentali da sapere. Ci sono stati molti "proiettili d'argento" durante la mia lunga carriera che in pratica si sono appena estinti, ma il paradigma OO si è rivelato buono. Imparalo, capiscilo, adoralo - sarai contento di averlo fatto :-)


(a) Inizialmente l'ho scritto come uno scherzo, ma si è rivelato corretto e, quindi, non così divertente. Lo stirene monomero è costituito da carbonio e idrogeno e il polistirene è costituito da gruppi di questo ,.C8H8(C8H8)n

Forse avrei dovuto dichiarare che un polipo era molte occorrenze della lettera panche se, ora che ho dovuto spiegare la battuta, anche questo non sembra neanche divertente.

A volte, dovresti smettere mentre sei dietro :-)


50
Greco, non latino :) ("y" e "ph" sono gli omaggi). E in greco, "morph-" è solo "forma", o "forma" - il significato inglese di " cambia forma" per "morph" è uno sviluppo successivo
AakashM,

16
Il polimorfismo non è correlato a OOP, ma OOP è correlato a polimorfismo perché lo supporta intrinsecamente (supponendo che sia un linguaggio OOP decente). Guarda FP per altri esempi di polimorfismo.
alternativa il

9
Queste 2 righe mi hanno aiutato:Poly = many and Morph = change or form
Jo Smo,

3
Polyp è l'abbreviazione di polypo (u) s. E pous è piede in greco. ;-)
Dirk,

2
@Shaun, penso che potresti usare il termine "interfaccia" in un senso troppo letterale / costrittivo - intendevo un termine inglese piuttosto che una definizione specifica di un linguaggio informatico arbitrario. Non significa esattamente la stessa funzione con esattamente gli stessi parametri, è semplicemente un modo di influenzare gli "oggetti" allo stesso modo, indipendentemente dal loro tipo concreto di base. Ciò può includere il sovraccarico del metodo con diversi tipi di parametri, nonché la forma più pura di polimorfismo.
paxdiablo,

250

Il polimorfismo è quando puoi trattare un oggetto come una versione generica di qualcosa, ma quando accedi ad esso, il codice determina quale tipo esatto è e chiama il codice associato.

Ecco un esempio in C #. Crea quattro classi all'interno di un'applicazione console:

public abstract class Vehicle
{
    public abstract int Wheels;
}

public class Bicycle : Vehicle
{
    public override int Wheels()
    {
        return 2;
    }
}

public class Car : Vehicle
{
    public override int Wheels()
    {
        return 4;
    }
}

public class Truck : Vehicle
{
    public override int Wheels()
    {
        return 18;
    }
}

Ora crea quanto segue nel Main () del modulo per l'applicazione console:

public void Main()
{
    List<Vehicle> vehicles = new List<Vehicle>();

    vehicles.Add(new Bicycle());
    vehicles.Add(new Car());
    vehicles.Add(new Truck());

    foreach (Vehicle v in vehicles)
    {
        Console.WriteLine(
            string.Format("A {0} has {1} wheels.",
                v.GetType().Name, v.Wheels));
    }
}

In questo esempio, creiamo un elenco della classe base Veicolo, che non conosce quante ruote ha ciascuna delle sue sottoclassi, ma sa che ogni sottoclasse è responsabile della conoscenza di quante ruote ha.

Aggiungiamo quindi una bicicletta, auto e camion all'elenco.

Successivamente, possiamo scorrere ogni veicolo nell'elenco e trattarli tutti in modo identico, tuttavia quando accediamo a ciascuna proprietà di "Ruote di veicoli", la classe del veicolo delega l'esecuzione di quel codice alla sottoclasse pertinente.

Si dice che questo codice sia polimorfico, poiché il codice esatto che viene eseguito è determinato dalla sottoclasse a cui viene fatto riferimento in fase di esecuzione.

Spero che questo ti aiuti.


6
Penso che questo sia un ottimo esempio per mostrare chiaramente l'interfaccia genitore, e che non è fino a quando l'oggetto non viene istanziato che è richiesta una versione concreta, cioè veicolo vs auto
cablata

1
Direi che questo è l'esempio più chiaro, anche se se sei un programmatore di PHP questo link potrebbe essere più facile da esaminare PRIMA, e quindi guardare questo dopo: code.tutsplus.com/tutorials/…
Oliver Williams

Inoltre (oltre lo scopo dell'OP) notare che stiamo vincolando l'analisi ad oggetti noti; non stiamo passando un oggetto (come un file di importazione) e quindi determinando che tipo è (Excel, CSV, YAML, SQL, ecc. ecc.). Per fare questo si avrebbe bisogno di una sorta di classe factory per Class_Excel, Class_CSVper essere chiamato, o per avere una Readerclasse chiamata. Ad ogni modo, una sorta di iterativo se / then / else dovrà essere archiviato da qualche parte.
Oliver Williams,

@Antony Gibbs: questo è davvero un buon esempio (un elenco di tipi generici) che ha senso per me .... altrimenti qual è il grosso del fatto che ogni classe ha la sua funzione di ruote senza ereditare da una classe di base? Ci sono altri concetti oltre all'elenco che sarebbero utili per i polimorfici?
TTT

195

Dalla comprensione e l'applicazione del polimorfismo in PHP , grazie Steve Guidetti.

Il polimorfismo è una parola lunga per un concetto molto semplice.

Il polimorfismo descrive uno schema nella programmazione orientata agli oggetti in cui le classi hanno funzionalità diverse condividendo un'interfaccia comune.

Il bello del polimorfismo è che il codice che lavora con le diverse classi non ha bisogno di sapere quale classe sta usando poiché sono tutte usate allo stesso modo. Un'analogia del mondo reale con il polimorfismo è un pulsante. Tutti sanno come usare un pulsante: basta semplicemente esercitare pressione su di esso. Ciò che "fa" un pulsante, tuttavia, dipende da ciò a cui è collegato e dal contesto in cui viene utilizzato, ma il risultato non influisce sul modo in cui viene utilizzato. Se il tuo capo ti dice di premere un pulsante, hai già tutte le informazioni necessarie per eseguire l'attività.

Nel mondo della programmazione, il polimorfismo viene utilizzato per rendere le applicazioni più modulari ed estensibili. Invece di dichiarazioni condizionali disordinate che descrivono diverse linee d'azione, crei oggetti intercambiabili che selezioni in base alle tue esigenze. Questo è l'obiettivo fondamentale del polimorfismo.


10
l'analogia dei pulsanti non è più correlata al concetto di astrazione?
thewpfguy


8
@Mantriur: Questo è davvero plagiato, e abbiamo delle regole contro questo: stackoverflow.com/help/referencing Ma dato il suo punteggio ora e il fatto che i vecchi post sono esenti dalla perdita di reputazione in caso di cancellazione della risposta, non sono sicuro se lo elimini ora, tutto sarebbe migliorato. La prossima migliore alternativa sarebbe quella di modificare l'attribuzione per conto dell'utente, anche se credo fermamente che gli utenti siano responsabili della citazione delle fonti nelle proprie risposte.
BoltClock

1
Credo che sia errato implicare che il polimorfismo è specifico per le classi e / o la programmazione orientata agli oggetti, visto che il polimorfismo ad hoc o il polimorfismo parametrico non richiedono necessariamente classi e / o oggetti. Penso che ciò di cui stia parlando questa risposta sia il sottotipo (noto anche come polimorfismo del sottotipo o polimorfismo dell'inclusione).
StubbornShowaGuy

64

Se qualcuno dice TAGLIO a queste persone

  1. Il chirurgo
  2. Lo stilista
  3. L'attore

Cosa accadrà?

  • Il chirurgo avrebbe iniziato a praticare un'incisione.
  • L'acconciatore avrebbe iniziato a tagliare i capelli a qualcuno.
  • L'attore smetterebbe bruscamente di recitare fuori dalla scena attuale, in attesa di una guida alla regia.

Quindi la rappresentazione sopra mostra cosa è il polimorfismo (stesso nome, comportamento diverso) in OOP.

Se stai per un'intervista e un intervistatore ti chiede di dire / mostrare un esempio dal vivo per il polimorfismo nella stessa stanza in cui siamo seduti, diciamo-

Risposta - Porta / Windows

Ti chiedi come?

Attraverso la porta / finestra: una persona può venire, l'aria può venire, la luce può venire, la pioggia può venire, ecc.

Per capirlo meglio e in modo semplice ho usato l'esempio sopra. Se hai bisogno di riferimento per il codice segui le risposte sopra.


5
Non penso che questo sia un ottimo esempio perché può portare le persone inesperte a pensare che se due classi hanno un .foo()metodo, dovrebbero condividere un'interfaccia comune. Tuttavia, questo non è vero e porta a astrazioni errate. Un'interfaccia dovrebbe definire un ruolo da svolgere, che può avere molte implementazioni diverse, ma tutte estraggono dallo stesso set di input e restituiscono qualcosa dallo stesso set di output. L'input in a x.cut(...)per un chirurgo, uno stilista o un attore non è lo stesso, e nemmeno l'output.
Matt Klein,

37

Spiegazione semplice per analogia

Il presidente degli Stati Uniti impiega il polimorfismo. Come? Bene, ha molti consiglieri:

  1. Consiglieri militari
  2. Consulenti legali
  3. Fisici nucleari (come consulenti)
  4. Consulenti medici
  5. ecc ecc.

Tutti dovrebbero essere responsabili solo di una cosa: Esempio:

Il presidente non è un esperto di zincatura o fisica quantistica. Non sa molte cose, ma sa solo una cosa: come gestire il paese.

È un po 'la stessa cosa con il codice: le preoccupazioni e le responsabilità dovrebbero essere separate dalle classi / persone pertinenti. Altrimenti avresti il ​​presidente che sapeva letteralmente tutto nel mondo - l'intera Wikipedia. Immagina di avere l'intera Wikipedia in una classe del tuo codice: sarebbe un incubo da mantenere.

Perché è una cattiva idea per un presidente conoscere tutte queste cose specifiche?

Se il presidente dovesse dire specificamente alla gente cosa fare, ciò significherebbe che il presidente deve sapere esattamente cosa fare. Se il presidente ha bisogno di conoscere da solo cose specifiche, ciò significa che quando è necessario apportare un cambiamento, è necessario farlo in due punti, non solo uno.

Ad esempio, se l'EPA modifica le leggi sull'inquinamento, quando ciò accade: dovresti apportare una modifica alla classe EPA e anche alla classe President. La modifica del codice in due posizioni anziché in una può essere pericolosa, poiché è molto più difficile da mantenere.

C'è un approccio migliore?

C'è un approccio migliore: il presidente non ha bisogno di conoscere i dettagli di nulla: può chiedere il miglior consiglio, da persone specificamente incaricate di fare quelle cose.

Può usare un approccio polimorfico per gestire il paese.

Esempio - di usare un approccio polimorfico:

Tutto ciò che il presidente fa è chiedere alle persone di consigliarlo - ed è quello che fa realmente nella vita reale - ed è quello che dovrebbe fare un buon presidente. tutti i suoi consiglieri rispondono in modo diverso, ma tutti sanno cosa intende il presidente: Advise (). Ha centinaia di persone in streaming nel suo ufficio. In realtà non importa chi siano. Tutto il presidente sa che quando chiede loro di "consigliare" sanno come rispondere di conseguenza :

public class MisterPresident
{
    public void RunTheCountry()
    {
        // assume the Petraeus and Condi classes etc are instantiated.
        petraeus.Advise(); // # Petraeus says send 100,000 troops to Fallujah
        condolezza.Advise(); // # she says negotiate trade deal with Iran
        healthOfficials.Advise(); // # they say we need to spend $50 billion on ObamaCare
    }
}

Questo approccio consente al presidente di gestire il paese letteralmente senza sapere nulla di materiale militare, assistenza sanitaria o diplomazia internazionale: i dettagli sono lasciati agli esperti. L'unica cosa che il presidente deve sapere è questa: "Advise ()".

Cosa NON vuoi:

public class MisterPresident
{
    public void RunTheCountry()
    {
        // people walk into the Presidents office and he tells them what to do
        // depending on who they are.

        // Fallujah Advice - Mr Prez tells his military exactly what to do.
        petraeus.IncreaseTroopNumbers();
        petraeus.ImproveSecurity();
        petraeus.PayContractors();

        // Condi diplomacy advice - Prez tells Condi how to negotiate

        condi.StallNegotiations();
        condi.LowBallFigure();
        condi.FireDemocraticallyElectedIraqiLeaderBecauseIDontLikeHim();

        // Health care

        healthOfficial.IncreasePremiums();
        healthOfficial.AddPreexistingConditions();
    }
}

NO! NO! NO! Nello scenario sopra, il presidente sta facendo tutto il lavoro: è a conoscenza dell'aumento del numero di truppe e delle condizioni preesistenti. Ciò significa che se cambiano le politiche mediorientali, allora il presidente dovrebbe cambiare i suoi comandi, così come la classe Petraeus. Dovremmo solo cambiare la classe di Petraeus, perché il Presidente non dovrebbe impantanarsi in quel tipo di dettagli. Non ha bisogno di conoscere i dettagli. Tutto quello che deve sapere è che se fa un ordine, tutto sarà curato. Tutti i dettagli dovrebbero essere lasciati agli esperti.

Ciò consente al presidente di fare ciò che fa meglio: impostare una politica generale, avere un bell'aspetto e giocare a golf: P.

Come viene effettivamente implementato - attraverso una classe base o un'interfaccia comune

Questo in effetti è il polimorfismo, in poche parole. Com'è fatto esattamente? Tramite "l'implementazione di un'interfaccia comune" o utilizzando una classe base (ereditarietà), vedere le risposte sopra che descrivono in modo più chiaro questo. (Per comprendere più chiaramente questo concetto, devi sapere cos'è un'interfaccia e dovrai capire cos'è l'eredità. Senza di ciò, potresti avere difficoltà.)

In altre parole, Petraeus, Condi e HealthOfficials tutto sarebbe classi che "implementano un'interfaccia" - chiamata di Ammettiamolo l' IAdvisorinterfaccia che contiene solo un metodo: Advise(). Ma ora stiamo entrando nei dettagli.

Questo sarebbe l'ideale

    public class MisterPresident
    {
            // You can pass in any advisor: Condi, HealthOfficials,
            //  Petraeus etc. The president has no idea who it will 
            // be. But he does know that he can ask them to "advise" 
            // and that's all Mr Prez cares for.

        public void RunTheCountry(IAdvisor governmentOfficer)
        {             
            governmentOfficer.Advise();              
        }
    }


    public class USA
    {
        MisterPresident president;

        public USA(MisterPresident president)
        {
            this.president = president;
        }

        public void ImplementPolicy()
        {
            IAdvisor governmentOfficer = getAdvisor(); // Returns an advisor: could be condi, or petraus etc.
            president.RunTheCountry(governmentOfficer);
        }
    }

Sommario

Tutto quello che devi veramente sapere è questo:

  • Il presidente non ha bisogno di conoscere i dettagli - quelli sono lasciati agli altri.
  • Tutto ciò che il presidente deve sapere è chiedere a chi entra nella porta di consigliarlo - e sappiamo che sapranno assolutamente cosa fare quando gli verrà chiesto di avvisare (perché sono tutti in realtà, consulenti (o IAdvisors :))

Spero davvero che ti aiuti. Se non capisci nulla, pubblica un commento e riproverò.


4
Esempio fantastico! Grazie.
Iman Sedighi,

1
Analogia molto interessante. Grazie.
Grazie

1
@TTT perché (1) ogni volta che hai un nuovo advisor, allora dovresti cambiare la classe presidente - non vuoi fare cambiamenti x2. solo uno. (2) in secondo luogo, se devi cambiare un consulente esistente, potresti dover tornare indietro e cambiare una di quelle tre chiamate nella classe presidenziale - vuoi davvero fare solo una modifica, non due. (3) se avessi avuto tre chiamate separate, dovresti chiedere, all'interno della classe presidenziale: if healthAdvisor? then do this:e if petraus then do that etc.questo schema dovrà essere ripetuto e ciò non è necessario e complicato. vedi sopra modifica.
BKSpurgeon,

1
@TTT sì hai ragione. ma devo presentare lentamente il concetto ai lettori, altrimenti non capiranno. ho aggiunto ulteriori modifiche. si prega di avvisare se sono necessari chiarimenti
BKSpurgeon,

1
@TTT classe base vs interfaccia è una decisione di progettazione che i programmatori devono prendere quando fanno il polimorfismo. vedi qui per maggiori dettagli: stackoverflow.com/questions/56867/interface-vs-base-class
BKSpurgeon

24

Il polimorfismo è la capacità di trattare una classe di oggetti come se fosse la classe genitore.

Ad esempio, supponiamo che esista una classe chiamata Animal e una classe chiamata Dog che eredita da Animal. Il polimorfismo è la capacità di trattare qualsiasi oggetto Cane come un oggetto Animale in questo modo:

Dog* dog = new Dog;
Animal* animal = dog;

Mi chiedo come sia collegato alla spiegazione (popolare) che @Ajay Patel ha datoclasses have different functionality while sharing a common interface
BornToCode

1
@BornToCode La classe genitore è / fornisce quell'interfaccia comune.
grokmann,

1
Il polimorfismo non richiede sottotipizzazione.
Shaun Luttin,

22

Polimorfismo:

È il concetto di programmazione orientata agli oggetti. La capacità di oggetti diversi di rispondere, ciascuno a modo suo, a messaggi identici è chiamata polimorfismo.

Il polimorfismo deriva dal fatto che ogni classe vive nel proprio spazio dei nomi. I nomi assegnati all'interno di una definizione di classe non sono in conflitto con i nomi assegnati ovunque all'esterno. Ciò vale sia per le variabili di istanza nella struttura dati di un oggetto sia per i metodi dell'oggetto:

  • Proprio come i campi di una struttura C si trovano in uno spazio dei nomi protetto, così come le variabili di istanza di un oggetto.

  • Anche i nomi dei metodi sono protetti. A differenza dei nomi delle funzioni C, i nomi dei metodi non sono simboli globali. Il nome di un metodo in una classe non può essere in conflitto con i nomi dei metodi in altre classi; due classi molto diverse possono implementare metodi identici.

I nomi dei metodi fanno parte dell'interfaccia di un oggetto. Quando viene inviato un messaggio che richiede che un oggetto faccia qualcosa, il messaggio nomina il metodo che l'oggetto deve eseguire. Poiché oggetti diversi possono avere metodi con lo stesso nome, il significato di un messaggio deve essere compreso in relazione al particolare oggetto che riceve il messaggio. Lo stesso messaggio inviato a due oggetti diversi può invocare due metodi distinti.

Il principale vantaggio del polimorfismo è che semplifica l'interfaccia di programmazione. Permette di stabilire convenzioni che possono essere riutilizzate in classe dopo lezione. Invece di inventare un nuovo nome per ogni nuova funzione aggiunta a un programma, è possibile riutilizzare gli stessi nomi. L'interfaccia di programmazione può essere descritta come un insieme di comportamenti astratti, a parte le classi che li implementano.

Esempi:

Esempio-1: Ecco un semplice esempio scritto in Python 2.x .

class Animal:
    def __init__(self, name):    # Constructor of the class
        self.name = name
    def talk(self):              # Abstract method, defined by convention only
        raise NotImplementedError("Subclass must implement abstract method")

class Cat(Animal):
    def talk(self):
        return 'Meow!'

class Dog(Animal):
    def talk(self):
        return 'Woof! Woof!'

animals = [Cat('Missy'),
           Dog('Lassie')]

for animal in animals:
    print animal.name + ': ' + animal.talk()

Esempio 2: il polimorfismo è implementato in Java usando il sovraccarico del metodo e concetti di prevalenza del metodo .

Consideriamo un esempio di auto per discutere del polimorfismo. Prendi qualsiasi marca come Ford, Honda, Toyota, BMW, Benz ecc., Tutto è di tipo Auto.

Ognuno di essi ha le proprie funzionalità avanzate e la tecnologia più avanzata coinvolta nel proprio comportamento di movimento.

Ora creiamo un'auto di tipo base

Car.java

public class Car {

    int price;
    String name;
    String color;

    public void move(){
    System.out.println("Basic Car move");
    }

}

Implementiamo l'esempio Ford Car.

Ford estende il tipo di auto per ereditare tutti i suoi membri (proprietà e metodi).

Ford.java

public class Ford extends Car{
  public void move(){
    System.out.println("Moving with V engine");
  }
}

La precedente classe Ford estende la classe Car e implementa anche il metodo move (). Anche se il metodo di spostamento è già disponibile per Ford tramite l'ereditarietà, Ford ha ancora implementato il metodo a modo suo. Questo si chiama override del metodo.

Honda.java

public class Honda extends Car{
  public void move(){
    System.out.println("Move with i-VTEC engine");
  }
}

Proprio come Ford, Honda estende anche il tipo di auto e ha implementato il metodo di spostamento a modo suo.

La sostituzione del metodo è una caratteristica importante per abilitare il polimorfismo. Usando l'override dei metodi, i sottotipi possono cambiare il modo in cui funzionano i metodi disponibili tramite l'ereditarietà.

PolymorphismExample.java

public class PolymorphismExample {
  public static void main(String[] args) {
    Car car = new Car();
    Car f = new Ford();
    Car h = new Honda();

    car.move();
    f.move();
    h.move();

  }
}

Esempio di polimorfismo:

Nel metodo principale della classe PolymorphismExample, ho creato tre oggetti: Car, Ford e Honda. Tutti e tre gli oggetti sono indicati dal tipo di automobile.

Si noti qui un punto importante che un tipo di superclasse può fare riferimento a un tipo di oggetto di sottoclasse ma il viceversa non è possibile. Il motivo è che tutti i membri della superclasse sono disponibili per la sottoclasse usando l'ereditarietà e durante il tempo di compilazione, il compilatore tenta di valutare se il tipo di riferimento che stiamo usando ha il metodo a cui sta tentando di accedere.

Quindi, per i riferimenti car, f e h nell'Esempio polimorfismo, il metodo di spostamento esiste dal tipo Car. Quindi, il compilatore passa il processo di compilazione senza problemi.

Ma quando si tratta dell'esecuzione in fase di esecuzione, la macchina virtuale invoca i metodi sugli oggetti che sono sottotipi. Pertanto, il metodo move () viene richiamato dalle rispettive implementazioni.

Quindi, tutti gli oggetti sono di tipo Car, ma durante il tempo di esecuzione l'esecuzione dipende dall'oggetto su cui avviene l'invocazione. Questo si chiama polimorfismo.


Il concetto di sovraccarico non ha nulla a che fare con l'ereditarietà e il polimorfismo.
srk

Il sovraccarico del metodo @srk è un modo per implementare il polimorfismo. È spesso classificato come polimorfismo statico o ad hoc. wiki.c2.com/?CategoryPolymorphism
Shaun Luttin,

12

Di solito ciò si riferisce alla capacità di un oggetto di tipo A di comportarsi come un oggetto di tipo B. Nella programmazione orientata agli oggetti ciò si ottiene di solito per eredità. Alcuni link di Wikipedia per saperne di più:

EDIT: collegamenti interrotti fissi.


10
"la capacità di un oggetto di tipo A di comportarsi come un oggetto di tipo B" - non è una definizione accurata. Direi che è più come la capacità di trattare un oggetto di tipo A come se fosse un oggetto di tipo B.
Artem Barger,

Sì. Forse è un fraseggio migliore.
JesperE,

Per completezza, molti linguaggi implementano il polimorfismo attraverso la tipizzazione delle anatre, ad esempio Python.
ilya n.

Mi chiedo come sia collegato alla spiegazione (popolare) che @Ajay Patel ha datoclasses have different functionality while sharing a common interface
BornToCode

9

Il polimorfismo è questo:

class Cup {
   int capacity
}

class TeaCup : Cup {
   string flavour
}

class CoffeeCup : Cup {
   string brand
}

Cup c = new CoffeeCup();

public int measure(Cup c) {
    return c.capacity
}

puoi passare solo una Coppa anziché un'istanza specifica. Questo aiuta in generale perché non è necessario fornire un'istanza misura () specifica per ciascun tipo di tazza


2
Questo è specificamente il polimorfismo dei sottotipi.
Shaun Luttin,

@ vinko-vrsalovic: com'è lo sviluppo del software in America rurale?
TTT

8

So che questa è una domanda più vecchia con molte buone risposte, ma vorrei includere una risposta di una frase:

Trattare un tipo derivato come se fosse il suo tipo base.

Ci sono molti esempi sopra che mostrano questo in azione, ma ritengo che questa sia una buona risposta concisa.


2
Questo è il sottotipo, che è solo un tipo di polimorfismo.
Shaun Luttin,

@ShaunLuttin puoi indicarmi qualche risorsa per saperne di più sugli altri tipi di polimorfismo?
Abe Miessler,

Esistono "polimorfismo ad hoc" e "polimorfismo parametrico" oltre al "polimorfismo sottotipo".
Shaun Luttin,

8

(Stavo sfogliando un altro articolo su qualcosa di completamente diverso .. e il polimorfismo spuntò ... Ora pensavo di sapere cosa fosse il polimorfismo .... ma apparentemente non in questo modo bellissimo spiegato ... Volevo scriverlo da qualche parte .. meglio ancora lo condividerò ...)

http://www.eioba.com/a/1htn/how-i-explained-rest-to-my-wife

continua a leggere da questa parte:

..... polimorfismo. È un modo geniale di dire che nomi diversi possono avere lo stesso verbo applicato a loro.


5

In generale, è la capacità di interfacciare un numero di diversi tipi di oggetti usando la stessa o superficialmente simile API. Esistono varie forme:

  • Sovraccarico di funzioni: definizione di più funzioni con lo stesso nome e diversi tipi di parametri, come sqrt (float), sqrt (double) e sqrt (complex). Nella maggior parte delle lingue che lo consentono, il compilatore selezionerà automaticamente quello corretto per il tipo di argomento che gli viene passato, quindi questo è polimorfismo in fase di compilazione.

  • Metodi virtuali in OOP: un metodo di una classe può avere varie implementazioni su misura per le specifiche delle sue sottoclassi; si dice che ciascuno di questi ha la precedenza sull'implementazione fornita nella classe base. Dato un oggetto che può appartenere alla classe base o ad una qualsiasi delle sue sottoclassi, l'implementazione corretta è selezionata al volo, quindi questo è polimorfismo di runtime.

  • Modelli: una caratteristica di alcuni linguaggi OO in base ai quali una funzione, una classe, ecc. Può essere parametrizzata da un tipo. Ad esempio, è possibile definire una classe di modello "elenco" generica e quindi istanziarla come "elenco di numeri interi", "elenco di stringhe", forse anche "elenco di elenchi di stringhe" o simili. Generalmente, si scrive il codice una volta per una struttura di dati di tipo di elemento arbitrario e il compilatore ne genera versioni per i vari tipi di elementi.


4

Il termine polimorfismo deriva da:

poli = molti

morfismo = la capacità di cambiare

Nella programmazione, il polimorfismo è una "tecnica" che ti permette di "guardare" un oggetto come più di un tipo di cosa. Per esempio:

Un oggetto studente è anche un oggetto persona. Se "guardi" (ad esempio il cast) allo studente, probabilmente puoi chiedere l'ID studente. Non puoi sempre farlo con una persona, giusto? (una persona non è necessariamente uno studente, quindi potrebbe non avere un ID studente). Tuttavia, una persona probabilmente ha un nome. Anche uno studente.

In conclusione, "guardare" lo stesso oggetto da "angolazioni" diverse può darti "prospettive" diverse (cioè proprietà o metodi diversi)

Quindi questa tecnica ti permette di costruire cose che possono essere "guardate" da diverse angolazioni.

Perché usiamo il polimorfismo? Per cominciare ... astrazione. A questo punto dovrebbero essere sufficienti informazioni :)


3

Usiamo un'analogia. Per una determinata sceneggiatura musicale ogni musicista che la interpreta dà il proprio tocco nell'interpretazione.

Il musicista può essere astratto con interfacce, il genere a cui appartiene il musicista può essere una classe abstrac che definisce alcune regole di interpretazione globali e ogni musicista che suona può essere modellato con una classe concreta.

Se sei un ascoltatore del lavoro musicale, hai un riferimento alla sceneggiatura, ad esempio "Fuga e Tocata" di Bach, e ogni musicista che lo esegue lo fa polimorficamente a modo suo.

Questo è solo un esempio di una possibile progettazione (in Java):

public interface Musician {
  public void play(Work work);
}

public interface Work {
  public String getScript();
}

public class FugaAndToccata implements Work {
  public String getScript() {
    return Bach.getFugaAndToccataScript();
  }
}

public class AnnHalloway implements Musician {
  public void play(Work work) {
    // plays in her own style, strict, disciplined
    String script = work.getScript()
  }
}

public class VictorBorga implements Musician {
  public void play(Work work) {
    // goofing while playing with superb style
    String script = work.getScript()
  }
}

public class Listener {
  public void main(String[] args) {
    Musician musician;
    if (args!=null && args.length > 0 && args[0].equals("C")) {
      musician = new AnnHalloway();
    } else {
      musician = new TerryGilliam();
    }
    musician.play(new FugaAndToccata());
}

1
AnnHallowaye VictorBorgasenti che dovrebbero essere oggetti piuttosto che classi - il tuo esempio sarebbe meglio leggere con es. public class Pianist implements Musiciane così victorBorge = new Pianist();via
Przemek D

3

Ho fornito una panoramica di alto livello del polimorfismo per un'altra domanda:

Polimorfismo in c ++

Spero che sia d'aiuto. Un estratto...

... aiuta a partire da un semplice test e dalla definizione di [polimorfismo]. Considera il codice:

Type1 x;
Type2 y;

f(x);
f(y);

Qui, f()è di eseguire alcune operazioni e viene dato i valori xe ycome input. Per essere polimorfico, f()deve essere in grado di operare con valori di almeno due tipi distinti (ad es. intE double), trovando ed eseguendo il codice di tipo appropriato.

(continua al polimorfismo in c ++ )


3

Il polimorfismo è un'abilità dell'oggetto che può essere assunta in molte forme. Ad esempio, nella classe umana un uomo può agire in molte forme quando parliamo di relazioni. ES: Un uomo è un padre per suo figlio ed è marito per sua moglie ed è insegnante per i suoi studenti.


3

Il polimorfismo è la capacità di un oggetto di assumere molte forme. L'uso più comune del polimorfismo in OOP si verifica quando si utilizza un riferimento di classe genitore per fare riferimento a un oggetto di classe figlio. In questo esempio scritto in Java, abbiamo tre tipi di veicoli. Creiamo tre diversi oggetti e proviamo a eseguire il loro metodo ruote:

public class PolymorphismExample {

    public static abstract class Vehicle
    {
        public int wheels(){
            return 0;
        }
    }

    public static class Bike extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 2;
        }
    }

    public static class Car extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 4;
        }
    }

    public static class Truck extends Vehicle
    {
        @Override
        public int wheels()
        {
            return 18;
        }
    }

    public static void main(String[] args)
    {
        Vehicle bike = new Bike();
        Vehicle car = new Car();
        Vehicle truck = new Truck();

        System.out.println("Bike has "+bike.wheels()+" wheels");
        System.out.println("Car has "+car.wheels()+" wheels");
        System.out.println("Truck has "+truck.wheels()+" wheels");
    }

}

Il risultato è:

Il risultato

Per ulteriori informazioni, visitare https://github.com/m-vahidalizadeh/java_advanced/blob/master/src/files/PolymorphismExample.java . Spero possa essere d'aiuto.


Sì, ma non hai spiegato quali sono i benefici del polimorfismo. Esiste ovviamente un codice più breve, in cui si eliminerebbe la classe Vehicle e funzionerebbe comunque (con una diversa dichiarazione dell'oggetto, ovviamente).
Cornelius,

Non ho spiegato, dal momento che la persona che ha posto la domanda non ha fatto domande sui benefici. Ha chiesto: "Che cos'è il polimorfismo, a cosa serve e come viene utilizzato?". Per quanto riguarda il codice, se puoi farlo meglio, pubblica la tua risposta. Quindi, la nostra community può usarlo. Grazie per il tuo commento.
Mohammad,

Scusa, non volevo sembrare scortese, anche gli altri non hanno spiegato. Almeno ti sei preoccupato di digitare il codice. Ad ogni modo, ha chiesto a cosa serve, ma nessuno degli esempi in questa pagina spiega a cosa serve. Presentate tutti un modo complesso per ottenere gli stessi risultati di questo: s28.postimg.org/jq8vl6031/Poly.jpg e nessuno si preoccupa di spiegare perché si dovrebbe voler usare il polimorfismo, qual è il suo guadagno o scopo, cosa non avrebbe potuto stato fatto se non fosse usato? Tutto quello che vedo in questa pagina è una proposta di salire nel tuo appartamento usando le scale e non un ascensore ..
Cornelius

.. senza notare che si trasporta un asta bandiera che è troppo grande per adattarsi a un ascensore. Non so come inserire il codice, quindi non posso essere di grande aiuto ...
Cornelius,

2

Il polimorfismo è la capacità del programmatore di scrivere metodi con lo stesso nome che fanno cose diverse per diversi tipi di oggetti, a seconda delle esigenze di tali oggetti. Ad esempio, se stavi sviluppando una classe chiamata Fractione una classe chiamata ComplexNumber, entrambe potrebbero includere un metodo chiamato display(), ma ognuna di esse implementerebbe quel metodo in modo diverso. In PHP, ad esempio, potresti implementarlo in questo modo:

//  Class definitions

class Fraction
{
    public $numerator;
    public $denominator;

    public function __construct($n, $d)
    {
        //  In real life, you'd do some type checking, making sure $d != 0, etc.
        $this->numerator = $n;
        $this->denominator = $d;
    }

    public function display()
    {
        echo $this->numerator . '/' . $this->denominator;
    }
}

class ComplexNumber
{
    public $real;
    public $imaginary;

    public function __construct($a, $b)
    {
        $this->real = $a;
        $this->imaginary = $b;
    }

    public function display()
    {
        echo $this->real . '+' . $this->imaginary . 'i';
    }
}


//  Main program

$fraction = new Fraction(1, 2);
$complex = new ComplexNumber(1, 2);

echo 'This is a fraction: '
$fraction->display();
echo "\n";

echo 'This is a complex number: '
$complex->display();
echo "\n";

Uscite:

This is a fraction: 1/2
This is a complex number: 1 + 2i

Alcune delle altre risposte sembrano implicare che il polimorfismo è usato solo in combinazione con l'eredità; per esempio, forse Fractioned ComplexNumberentrambi implementano una classe astratta chiamata Numberche ha un metodo display(), che Fraction e ComplexNumber sono quindi entrambi obbligati a implementare. Ma non hai bisogno dell'eredità per sfruttare il polimorfismo.

Almeno in linguaggi tipicamente dinamici come PHP (non conosco C ++ o Java), il polimorfismo consente allo sviluppatore di chiamare un metodo senza necessariamente conoscere il tipo di oggetto in anticipo e confidando che la corretta implementazione del metodo essere chiamato. Ad esempio, supponiamo che l'utente scelga il tipo di Numbercreato:

$userNumberChoice = $_GET['userNumberChoice'];

switch ($userNumberChoice) {
    case 'fraction':
        $userNumber = new Fraction(1, 2);
        break;
    case 'complex':
        $userNumber = new ComplexNumber(1, 2);
        break;
}

echo "The user's number is: ";
$userNumber->display();
echo "\n";

In questo caso, display()verrà chiamato il metodo appropriato , anche se lo sviluppatore non può sapere in anticipo se l'utente sceglierà una frazione o un numero complesso.


2
Questo non è polimorfismo. Sono due classi con metodi con lo stesso nome. Avrebbero bisogno di essere collegati da una classe base o un'interfaccia chiamata "visualizzabile" o qualcosa di simile, e quindi altri metodi si preoccuperebbero semplicemente che l'oggetto sia di tipo "visualizzabile" piuttosto che complesso o frazione.
Pod

Ho sempre pensato che il polimorfismo fosse "due classi con metodi con lo stesso nome". In effetti, per citare Stephan Kochan (da cui sono spudorato strappare questo esempio di frazione / complesso), "la capacità di condividere lo stesso nome di metodo tra classi diverse è nota come polimorfismo". (da Programming_In_Objective-C ) Non menziona la necessità di collegare le classi attraverso una classe base. Forse è diverso in diverse lingue, sinceramente non lo so.
Alex Basson,

Anche se questa definizione è citata da un libro pubblicato, direi comunque che non è corretta. Soprattutto dal momento che sembra scontrarsi con ogni altra, linguaggio agnostico di defenizione del polimorfismo. E mentre il risultato finale è lo stesso visto con il polimorfismo, direi che è invece la tipizzazione dinamica che consente al programmatore di essere in grado di sostenere che viene chiamata la corretta implementazione di un metodo tra altri metodi con nomi simili.
vipirtti,

2

Nella programmazione orientata agli oggetti, il polimorfismo si riferisce alla capacità di un linguaggio di programmazione di elaborare oggetti in modo diverso a seconda del tipo di dati o della classe . Più specificamente, è la capacità di ridefinire i metodi per le classi derivate.


2

Il polimorfismo significa letteralmente forme multiple. (o molti moduli): oggetto di classi diverse e metodo con lo stesso nome, ma i flussi di lavoro sono diversi. Un semplice esempio potrebbe essere:

Considera una persona X.

È solo una persona ma agisce come tanti. Puoi chiedere come:

È un figlio di sua madre. Un amico per i suoi amici. Un fratello per sua sorella.


2

Il polimorfismo in OOP significa che una classe potrebbe avere diversi tipi, l'ereditarietà è un modo per implementare il polimorfismo.

per esempio, Shape è un'interfaccia, ha sottotipi Square , Circle , Diamond . ora hai un oggetto quadrato, puoi eseguire l'upgrade automatico di Square a Shape, perché Square è una forma. Ma quando si tenta di eseguire il downcasting di Shape to Square, è necessario eseguire il cast di tipo esplicito, poiché non si può dire che Shape sia Square, potrebbe anche essere Circle. quindi devi lanciarlo manualmente con un codice come Square s = (Square)shape, e se la forma fosse Circle, otterrai java.lang.ClassCastException, perché Circle non è Square.


2

Polimorfismo:

Esecuzione diversa in base all'istanza della classe, non al tipo di variabile di riferimento.

Una variabile di riferimento del tipo di interfaccia può fare riferimento a qualsiasi istanza di classe che implementa tale interfaccia.


1

Il polimorfismo è la capacità di usare un oggetto in una data classe, in cui tutti i componenti che compongono l'oggetto sono ereditati da sottoclassi di una determinata classe. Ciò significa che una volta che questo oggetto è stato dichiarato da una classe, tutte le sottoclassi al di sotto di essa (e le loro sottoclassi, e così via fino a raggiungere la sottoclasse più lontana / più bassa) ereditano l'oggetto e i suoi componenti (trucco).

Ricorda che ogni classe deve essere salvata in file separati.

Il seguente codice esemplifica il polimorfismo:

La SuperClass:

public class Parent {
    //Define things that all classes share
    String maidenName;
    String familyTree;

    //Give the top class a default method
    public void speak(){
         System.out.println("We are all Parents");
    }
}

Il padre, una sottoclasse:

public class Father extends Parent{
    //Can use maidenName and familyTree here
    String name="Joe";
    String called="dad";

    //Give the top class a default method
    public void speak(){
        System.out.println("I am "+name+", the father.");
    }
}

Il bambino, un'altra sottoclasse:

public class Child extends Father {
    //Can use maidenName, familyTree, called and name here

    //Give the top class a default method
    public void speak(){
        System.out.println("Hi "+called+". What are we going to do today?");
    }
}

Il metodo di esecuzione fa riferimento alla classe Parent per iniziare:

public class Parenting{
    public static void main(String[] args) {
        Parent parents = new Parent();
        Parent parent = new Father();
        Parent child = new Child();

        parents.speak();
        parent.speak();
        child.speak();
    }
}

Si noti che ogni classe deve essere dichiarata in file * .java separati. Il codice dovrebbe essere compilato. Si noti inoltre che è possibile utilizzare continuamente maidenName e familyTree più in basso. Questo è il concetto di polimorfismo. Anche qui viene esplorato il concetto di eredità, in cui una classe può essere utilizzata o ulteriormente definita da una sottoclasse.

Spero che questo aiuti e lo chiarisca. Pubblicherò i risultati quando troverò un computer che posso usare per verificare il codice. Grazie per la pazienza!


2
si noti che ogni bambino non è un genitore, quindi questa struttura è sbagliata. La classe superiore dovrebbe essere Child (se non stai solo iniziando con "Person") che sarà sempre vero tranne Adam. Potresti impostare il suo parent_id su null poiché il Creatore non può essere definito con alcun costrutto dell'intelletto umano.
Yehosef,

1

Il polimorfismo consente alla stessa routine (funzione, metodo) di agire su tipi diversi.

Poiché molte risposte esistenti stanno fondendo il sottotipo con il polimorfismo, qui ci sono tre modi (incluso il sottotipo) per implementare il polimorfismo.

  • Il polimorfismo parametrico (generico) consente ad una routine di accettare uno o più parametri di tipo, oltre ai parametri normali, e si esegue su quei tipi.
  • Il polimorfismo dei sottotipi consente a una routine di agire su qualsiasi sottotipo dei suoi parametri.
  • Il polimorfismo ad hoc usa generalmente un sovraccarico di routine per garantire un comportamento polimorfico, ma può riferirsi anche ad altre implementazioni di polimorfismo.

Guarda anche:

http://wiki.c2.com/?CategoryPolymorphism

https://en.wikipedia.org/wiki/Polymorphism_(computer_science)


0

Nei linguaggi orientati agli oggetti, il polimorfismo consente il trattamento e la gestione di diversi tipi di dati attraverso la stessa interfaccia. Ad esempio, si consideri l'ereditarietà in C ++: la classe B è derivata dalla classe A. Un puntatore di tipo A * (puntatore alla classe A) può essere utilizzato per gestire sia un oggetto di classe A che un oggetto di classe B.


0

Il polimorfismo in termini di codifica è quando il tuo oggetto può esistere come tipi multipli attraverso l'ereditarietà ecc. Se crei una classe denominata "Forma" che definisce il numero di lati del tuo oggetto, puoi creare una nuova classe che lo eredita come "Quadrato ". Quando successivamente crei un'istanza di "Quadrato", puoi lanciarla avanti e indietro da "Forma" a "Quadrato" come richiesto.


0

Il polimorfismo ti dà la possibilità di creare un modulo chiamandone un altro, e tuttavia avere il punto di dipendenza del tempo di compilazione contro il flusso di controllo anziché con il flusso di controllo.

Utilizzando il polimorfismo, un modulo di alto livello non dipende dal modulo di basso livello. Entrambi dipendono dalle astrazioni. Questo ci aiuta ad applicare il principio di inversione di dipendenza ( https://en.wikipedia.org/wiki/Dependency_inversion_principle ).

Qui è dove ho trovato la definizione sopra. Circa 50 minuti nel video, l'istruttore spiega quanto sopra. https://www.youtube.com/watch?v=TMuno5RZNeE


0

Cos'è il polimorfismo?

Il polimorfismo è la capacità di:

  • Richiamare un'operazione su un'istanza di tipo specializzato conoscendo solo il suo tipo generalizzato mentre si chiama il metodo di tipo specializzato e non quello di tipo generalizzato: si tratta di un polimorfismo dinamico .

  • Definisci diversi metodi con il nome di salvataggio ma con parametri diversi: è un polimorfismo statico .

Il primo se la definizione storica e il più importante.

A cosa serve il polimorfismo?

Permette di creare una coerenza fortemente tipizzata della gerarchia di classi e di fare alcune cose magiche come la gestione di elenchi di oggetti di tipi diversi senza conoscerne i tipi ma solo uno dei loro tipi principali, nonché i collegamenti ai dati.

Digitazione forte e debole

Campione

Ecco alcune forme come Punto, Linea, Rettangolo e Cerchio con l'operazione Disegna () che non richiede nulla o un parametro per impostare un timeout per cancellarlo.

public class Shape
{
 public virtual void Draw()
 {
   DoNothing();
 }
 public virtual void Draw(int timeout)
 {
   DoNothing();
 }
}

public class Point : Shape
{
 int X, Y;
 public override void Draw()
 {
   DrawThePoint();
 }
}

public class Line : Point
{
 int Xend, Yend;
 public override Draw()
 {
   DrawTheLine();
 }
}

public class Rectangle : Line
{
 public override Draw()
 {
   DrawTheRectangle();
 }
}

var shapes = new List<Shape> { new Point(0,0), new Line(0,0,10,10), new rectangle(50,50,100,100) };

foreach ( var shape in shapes )
  shape.Draw();

Qui la classe Shape e i metodi Shape.Draw () devono essere contrassegnati come astratti.

Non sono per far capire.

spiegazione

Senza polimorfismo, usando abstract-virtual-override, mentre analizza le forme, è solo il metodo Spahe.Draw () che viene chiamato come CLR non sa quale metodo chiamare. Quindi chiama il metodo del tipo su cui agiamo, e qui il tipo è Shape a causa della dichiarazione dell'elenco. Quindi il codice non fa nulla.

Con il polimorfismo, il CLR è in grado di inferire il tipo reale dell'oggetto su cui agiamo usando quella che viene chiamata una tabella virtuale. Quindi chiama il bene metodo e qui chiama Shape.Draw () se Shape is Point chiama Point.Draw (). Quindi il codice disegna le forme.

Altre letture

C # - Polimorfismo (Livello 1)

Polimorfismo in Java (Livello 2)

Polimorfismo (Guida per programmatori C #)

Tabella dei metodi virtuali

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.