Polimorfismo - Definisci in due sole frasi [chiuso]


85

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 esempi. Non voglio sentire 'Quindi hai una persona / macchina / apriscatole ...' o come viene derivata la parola (nessuno è impressionato dal fatto che tu sappia cosa significano poly e morph). Se hai un'ottima conoscenza di cosa sia il polimorfismo e hai una buona padronanza dell'inglese, dovresti essere in grado di rispondere a questa domanda in una definizione breve, anche se densa. Se la tua definizione definisce accuratamente il polimorfismo ma è così densa che richiede un paio di letture, allora è esattamente quello che sto cercando.

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

Polimorfismo vs Sovrascrittura vs Sovraccarico
Prova a descrivere il polimorfismo nel modo più semplice possibile

Perché sto facendo questa domanda? Perché mi è stata posta la stessa domanda e ho scoperto di non essere in grado di trovare una definizione soddisfacente (per i miei standard, che sono piuttosto alti). Voglio vedere se qualcuna delle grandi menti di questo sito può farlo.

Se davvero non puoi fare il requisito delle due frasi (è un argomento difficile da definire), allora va bene se vai oltre. L'idea è di avere una definizione che definisca effettivamente cos'è il polimorfismo e non spieghi cosa fa o come usarlo (capisci la differenza?).


Un nome, molteplici implementazioni.
Prosunjit Biswas

2
Mi è stata posta questa domanda in un colloquio di lavoro. Sentivo che chiederlo in un colloquio di lavoro fosse uno snobismo elitario, il genere di cosa che un dipendente di Google chiederebbe compiaciuto supponendo che nessuno potesse rispondere in modo efficace. Se non hai ottenuto il lavoro perché non hai potuto rispondere, probabilmente stai meglio lavorando per persone che sono più interessate a ciò che puoi fare piuttosto che a chi puoi superare in astuzia.
MagicLAMP

Il polimorfismo è un concetto molto importante da comprendere durante lo sviluppo. Consiglio vivamente di comprenderne almeno il valore se non la definizione formale. Suggerisco di essere in grado di spiegare almeno come funziona il modello di strategia e il suo valore.
Chad Johnson

Risposte:


106

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

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


1
Mark, a un certo punto hai accettato questa risposta e poi l'hai rifiutata? Sto cercando di capire quello che sembra un bug nel sistema di reputazione: questa risposta mi ha dato una rete di -15 rep per oggi, abbastanza stranamente.
Jon Skeet

Lo stesso qui, Jon - ora ho 2 risposte accettate con -15 rep. Non che mi importi ma è intrigante.
Otávio Décio

3
A rigor di termini, non è richiesto che "un tipo esprima una sorta di contratto". Tutto ciò che è realmente richiesto è che più implementazioni possano rispondere allo stesso messaggio senza che il mittente del messaggio debba sapere o preoccuparsi di quale implementazione sta gestendo il messaggio.
Doug Knesek,

3
@Doug: Se non c'è un contratto, anche implicito nella documentazione o nella denominazione, come diavolo fai a sapere che farà quello che vuoi? Parli di una "interfaccia" nella tua risposta - che a me suona molto come un contratto - che differenza vedi? Sia "interfaccia" che "contratto" sono parole che possono essere usate in un senso "forte" (ad es. Applicato in fase di compilazione) o molto liberamente (ad es. Convenzioni di denominazione e digitando dinamici).
Jon Skeet,

1
@Alex: Sì, sarebbe una modifica che annullerei - preferisco la mia formulazione. Puoi sempre aggiungere la tua risposta però.
Jon Skeet

72

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

Beh, almeno lo so, ma sono strano in alcuni modi, quindi cosa ne so.

Ciò 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à degli oggetti, polimorfismo, incapsulamento, cose virtuali, cose astratte, cose private, cose pubbliche, questi sono tutti concetti difficili. Se qualcuno vuole assolutamente avere una definizione di 2 frasi di questo, si prega di contrassegnare la domanda come una variante del golf del codice, perché due di queste frasi dovranno essere così concise che a meno che non si sappia già di cosa si tratta non si impara abbastanza per sapere di cosa hai bisogno per saperne di più.


lassevk: "a meno che tu non sappia già di cosa si tratta, non ne imparerai abbastanza per sapere di cosa hai bisogno per saperne di più" << Solo per chiarire, è quello che mi aspetto. Sto cercando una definizione che possa richiedere qualche riflessione per capire. Non uno che verrebbe utilizzato per insegnare a un principiante.
Mark Testa

2
L'ho capito, ho appena pubblicato una risposta un po 'divertente (per me comunque) :) Il polimorfismo e l'OOP è una di quelle cose grandi del muro, dove se tracciate il grafico della curva di apprendimento, colpite semplicemente un grande muro e o vi strisciate sopra o non lo fai. Se lo fai, di solito hai un grande AHA! esperienza ...
Lasse V. Karlsen

8
Anche la cicuta è un frutto! Puoi mangiarlo ma solo una volta!
James Anderson

@JamesAnderson Quindi, un singleton?
Lasse V. Karlsen

47

Il polimorfismo dichiara un'interfaccia uniforme che non è in grado di riconoscere i tipi, lasciando i dettagli di implementazione ai tipi concreti che implementano l'interfaccia.


Questo è incredibilmente succinto e penso che calzi perfettamente
Alex W

21

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


21

In realtà, ci sono molteplici forme di polimorfismo e c'è una certa controversia su di esso; potresti persino vedere professori di informatica 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 della funzione membro).

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


2
+1 per aver menzionato che esistono diversi tipi di polimorfismo. Tuttavia, la tua definizione di polimorfismo ad-hoc sembra essere abbastanza diversa da quella menzionata su en.wikipedia.org/wiki/Type_polymorphism . Quella pagina dice che ci sono 2 tipi (ad-hoc contro parametrico), non 3, e fa anche una distinzione tra funzioni polimorfiche e tipi di dati polimorfici. I tuoi 3 tipi, per quanto posso determinare, corrispondono rispettivamente a funzioni polimorfiche parametriche, tipi di dati polimorfici parametrici e funzioni polimorfiche ad-hoc.
Laurence Gonsalves

ciao, qual è la differenza tra "istanza di qualche tipo generico" e "eredita da un altro tipo" questi sembrano dire la stessa cosa?
Shanimal

@LaurenceGonsalves fwiw, il collegamento fornito nel primo commento punta a tre tipi. Il polimorfismo parametrico è definito come la possibilità di scrivere "genericamente" una funzione o un tipo di dati.
Shanimal

14

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

La capacità di oggetti di un tipo di avere la stessa interfaccia, ma diversa implementazione di questa interfaccia.


10

Definizione :

Il polimorfismo è una parola da $ 10 per un'idea da $ 1 - che quando chiedo che qualcosa sia fatto, non mi interessa come viene raggiunto fintanto che il risultato finale è appropriato. Finché il servizio viene fornito correttamente, non mi interessa l' implementazione .

Discussione

Sebbene sia comunemente usato nello sviluppo di software, specialmente in 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 il telefono, compongo un numero e parlo con la parte dall'altra parte. Non mi interessa chi ha realizzato il telefono, quale tecnologia utilizza, se è cablato, wireless, mobile o VOIP o se è in garanzia.

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


5
suona come un esempio Encapsulationper me
Singleton

1
Il polimorfismo, l'incapsulamento e l'astrazione sono tutti abbastanza strettamente correlati, sebbene si concentrino su prospettive diverse. Buone astrazioni rendono il polimorfismo più facile da ottenere e un buon incapsulamento aiuta a prevenire la "fuoriuscita" dei dettagli.
Bevan

10

Molteplici implementazioni della stessa interfaccia.

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


8

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

Ok, è difficile ...


7

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

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

Polimorfismo ad hoc

Il polimorfismo ad hoc è l'atto di fornire più implementazioni dello stesso metodo per diversi tipi di parametri. In OOP , è generalmente noto come sovraccarico del metodo . Per 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 formatmetodi condividono un'unica interfaccia , ma funzionano su entità di diversi tipi .

Polimorfismo parametrico

Il 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 definito generici .

Ad esempio, Java si List[T]aspetta un parametro Tal 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 avrebbero solo infangato le acque in questo contesto.

List[String]e List[Date]condividono un'unica interfaccia , ma lavorano su (e sono) tipi diversi .

Sottotipo polimorfismo

Il polimorfismo del sottotipo è probabilmente ciò che intendevi inizialmente nella tua domanda: è l'atto di fornire una singola interfaccia a più implementazioni dello stesso tipo.

Per usare il consueto esempio: Animalfornisce un contratto che tutte le implementazioni devono rispettare. Dogè un Animal, e come tale supporta tutte le operazioni che Animaldichiara. Secondo il principio di sostituzione di Liskov , ciò consente di utilizzare un'istanza in Dogcui Animalè prevista un'istanza di (ma non il contrario).

Se Cate Dogsono entrambe sottoclassi di Animal, condividono un'unica interfaccia ma in realtà sono tipi diversi .

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


quindi per quanto riguarda il polimorfismo basato sull'interfaccia?
siamak

@siamak non è solo un tipo specifico di polimorfismo di sottotipo in cui il tipo genitore è completamente astratto? O intendi qualcos'altro?
Nicolas Rinaudo

La mia intenzione di interfaccia è l'interfaccia come un tipo di riferimento che esiste nei linguaggi orientati agli oggetti, come questo: Interfaccia I1 {void M ();} Credo che ci siano così tante differenze tra sottotipo o polimorfismo basato sull'ereditarietà e polimorfismo basato sull'interfaccia . Perché esiste una relazione "È-a" nel polimorfismo basato sull'ereditarietà tra i tipi, ma non esiste una cosa del genere nel polimorfismo basato sull'interfaccia. In effetti uno stesso comportamento con implementazioni diverse potrebbe essere condiviso tra vari tipi (classi) diversi
siamak

Devo ammettere che sono confuso: a parte il tuo approccio un po 'balistico al case superiore, sembra che la tua descrizione di ciò che chiami polimorfismo basato sull'interfaccia sia esattamente la stessa della mia descrizione del polimorfismo del sottotipo. Sono sicuro che vedi una differenza, ma temo che non sia davvero chiaro per me.
Nicolas Rinaudo

Come puoi vedere non esiste alcuna relazione tra macchina e uccello e persona, ma possono muoversi a modo loro. C'è un'enorme differenza tra la classe Abstract e l'interfaccia e l'uso dell'interfaccia non è la stessa cosa del sottotipo, quindi secondo me il polimorfismo dell'ereditarietà e il polimorfismo basato sull'interfaccia non sono le stesse cose e non sono uguali. // è difficile, codifica nel segmento dei commenti //
siamak

6

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

Esistono due tipi di polimorfismo:

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

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

2.  Run time or (dynamic) polymorphism.

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

Ma nella terminologia .NET solo il secondo ( intendo il polimorfismo a runtime ) è in realtà supposto come polimorfismo e chiamato semplicemente polimorfismo .

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

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

Produzione:

 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:

Continuo a non vedere la differenza che fai. Persona, Uccello e Macchina sono tutti sottotipi di Imobile. La persona è un'Imobile, Bird è un'Imobile e Auto è un'Imobile. Se dovessi richiedere una variabile di tipo Imobile, potresti utilizzare un'istanza di Persona, Uccello o Auto, tutti digiterebbero il controllo. Questo è esattamente ciò che significa polimorfismo del sottotipo.
Nicolas Rinaudo

Bird e Person e Car non sono sottotipi di Imobile, sono gli implementatori di quell'interfaccia e "realizzano" quell'interfaccia a modo loro. Il termine "sottotipo" è ampiamente utilizzato tra un tipo reale e un sottotipo reale che ha ereditato da esso, e in questa situazione c'è una relazione "Is-a" tra loro, per esempio un cane è il sottotipo di un mammifero.
siamak

dal punto di vista del compilatore fare riferimento a un'interfaccia e usare i riferimenti è qualcosa di vero e corretto. / MA / IT non è un concetto uguale con sottotipizzazione in una relazione di eredità. E penso che chiamare gli implementatori di un'interfaccia come sottotipi sia così imbarazzante e in realtà non vero.
siamak

Un esempio di polimorfismo basato sull'ereditarietà farebbe bene a spiegare questa risposta.
Marcelo Mason

5

Il polimorfismo è un'astrazione di codifica software in cui diverse entità sottostanti (di solito dati, ma sempre nitide) condividono un'interfaccia comune che consente loro di apparire e agire in modo identico in fase di esecuzione. Utilizziamo questa tecnica come tecnica di sviluppo per imporre un comportamento coerente su un'ampia gamma di istanze simili, ma non identiche, con un'implementazione minima assoluta, riducendo così l'aspettativa di bug e incongruenze.

Paolo.


5

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


2

Molteplici forme di un singolo oggetto sono chiamate polimorfismo.



2

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


2

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


Downvoter - Potresti spiegare perché?
TarkaDaal

1

Dare un unico nome a un insieme di operazioni analoghe su tipi diversi. Se fatto bene, l'analogia è ovvia, ad esempio "aggiungendo" numeri aritmeticamente e "aggiungendo" stringhe per concatenazione (che somma le loro lunghezze).


1

Questa è la definizione che ho sempre seguito:

Due oggetti sono polimorfici (rispetto a un particolare protocollo) tra loro, se entrambi rispondono agli stessi messaggi con la stessa semantica.

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

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


1

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


1

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


1

Il polimorfismo è una funzionalità del linguaggio 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 messi in contrasto nella mia risposta: Polymorphism in c ++ )


0

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

È possibile definire un elenco come segue:

List list = new List();

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

IList list = new List();

e usa il IListriferimento liberamente. Supponendo che IListsia implementato anche in un'altra classe, è possibile utilizzare i metodi di quella classe sconosciuta tramite di nuovo IListriferimento senza cercare di ricordare il nome di quella classe. Meraviglioso, non è 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 .NEToverride parola chiave ).

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


1
Sono più di 2 frasi.
Pericoloso

0

Per una data firma del metodo, vengono eseguite implementazioni di metodi differenti per classi differenti, gerarchicamente correlate.


0

Il polimorfismo è la capacità di utilizzare classi differenti che implementano un'interfaccia comune (o estendono una classe base comune) in un modo comune, senza bisogno di implementazioni specifiche e utilizzando solo i metodi disponibili nell'interfaccia comune.

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


0

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


0

Penso che l'implementazione di metodi della stessa firma in classi diverse (che hanno una sorta di relazione di ereditarietà usando extends o implements) sia il metodo che sostituisce e anche il polimorfismo perché in questo modo stiamo ottenendo molte forme della stessa firma del metodo.


-2

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

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

Non ti importerebbe se è un quadrato, un triangolo o un rettangolo. Ti interessa solo la zona. Quindi il metodo getArea verrà chiamato a seconda dell'oggetto dinamico passato.


-2

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


Perché qualcuno l'ha annotato - questa è la "risposta letterale" dalla pagina web di National Instrument sul polimorfismo !!!
J-Dizzle

-3

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.


In realtà, il polimorfismo vede istanze di classi diverse come un tipo comune ed è stato in grado di utilizzare i metodi dichiarati in questo tipo comune indipendentemente da come le diverse classi implementano quei metodi.
GaRRaPeTa
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.