Programmazione generica: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Tradotta sezione "Programming language support for genericity" |
Tradotta sezione "In object-oriented languages" |
||
Riga 44:
Di seguito verranno presentate le funzionalità di programmazione generica di diversi linguaggi di programmazione. Per uno studio specifico che compari l'adeguatezza di vari meccanismi di programmazione generica consulta il testo in nota.<ref name="cita Garcia 2007">{{cita|Garcia 2007}}.</ref>
=== Nei linguaggi orientati agli oggetti ===
Nel creare [[classe (informatica)|classi]] container nei linguaggi a [[tipizzazione statica]] risulta inconveniente scrivere un'implementazione per ogni tipo di dato che si vuole trattare, specialmente se il codice per ogni tipo è virtualmente identico. Per esempio in [[C++]] questa duplicazione di codice può essere evitata definendo una classe template:
<syntaxhighlight lang="Cpp" rows>
template <typename T>
class List
{
// Class contents.
};
List<Animal> list_of_animals;
List<Car> list_of_cars;
</syntaxhighlight>
Nell'esempio sopra il simbolo <code>T</code> è un ''placeholder''<ref>{{lett|segnaposto|lingua=it}}</ref> per il tipo che viene specificato specificato all'atto di creazione della lista (righe 6-7).
Questi "contenitori di tipo <code>T</code>", comunemente chiamati ''template'', permettono di riutilizzare il codice di una classe variandone i tipi di dato utilizzati all'interno, posto che determinati "[[contratto (programmazione)|contratti]]" come i [[sottoclasse (informatica)|sotto-tipi]] e le [[firma (programmazione)|segnature]] siano mantenuti.
Questo meccanismo di programmazione generica non deve essere confuso con il [[polimorfismo (informatica)|polimorfismo]], che è l'utilizzo [[algoritmo|algoritmico]] di sotto-classi equivalenti: per esempio, una lista di oggetti di tipo <code>MovingObject</code><ref>{{lett|Oggetto in movimento|lingua=it}}</ref> contenente oggetti di tipo <code>Animal</code> e <code>Car</code>. I template possono essere usati anche per realizzare funzioni indipendenti dai tipi come nell'esempio di seguito:
<syntaxhighlight lang="Cpp">
// "T&" denota un riferimento ad un oggetto di tipo T
template <typename T>
void swap(T& a, T& b)
{
T temp = b;
b = a;
a = temp;
}
std::string world = "World!";
std::string hello = "Hello, ";
swap(world, hello);
std::cout << world << hello << ‘\n’;
</syntaxhighlight>
Il costrutto <code>template</code> del C++ utilizzato sopra è largamente citato come il costrutto di programmazione generica che ha popolarizzato la nozione tra programmatori e progettisti di linguaggi, e supporta molti [[idioma|idiomi]] di programmazione generica. Il linguaggio D offre template basati su quelli del C++ ma con una sintassi semplificata. Java offre funzionalità di programmazione generica, sintatticamente basate su quelle del C++, a partire da J2SE 5.0.
[[C sharp|C#]] 2.0, [[Oxygene (linguaggio di programmazione)|Oxygene]] 1.5 e [[Visual Basic .NET]] 2005 hanno costrutti che sfruttano il supporto per i ''generic'' presenti nel [[.NET Framework]] dalla versione 2.0.
-----
|