Metodi generici
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 66 di 110.
Proprio come le classi possono essere generiche, anche i singoli metodi possono avere i propri parametri di tipo. Questo è utile quando hai bisogno di un metodo flessibile senza rendere generica l'intera classe.
Un metodo generico dichiara il parametro di tipo prima del tipo restituito:
T findFirst<T>(List<T> items) {
return items.first;
}
void main() {
var firstNumber = findFirst<int>([1, 2, 3]);
var firstWord = findFirst<String>(['hello', 'world']);
print(firstNumber); // 1
print(firstWord); // hello
}Spesso Dart può dedurre il tipo dagli argomenti, quindi non è sempre necessario specificarlo esplicitamente:
var result = findFirst([10, 20, 30]); // Dart deduce intI metodi generici sono particolarmente utili all'interno delle classi quando solo alcune operazioni necessitano di flessibilità nei tipi:
class Printer {
void printItem<T>(T item) {
print('Printing: $item');
}
List<T> duplicate<T>(T item, int count) {
return List.filled(count, item);
}
}
void main() {
var printer = Printer();
printer.printItem<String>('Hello');
printer.printItem(42); // Tipo dedotto come int
var copies = printer.duplicate('Hi', 3);
print(copies); // [Hi, Hi, Hi]
}I metodi generici ti offrono un controllo dettagliato sulla sicurezza dei tipi a livello di metodo, mantenendo le tue classi più semplici e beneficiando comunque del controllo dei tipi in fase di compilazione.
Sfida
FacileCostruiamo un’utilità per la trasformazione dei dati che mostri la potenza dei metodi generici. Creerai una classe Transformer con metodi che possono funzionare con qualsiasi tipo, offrendoti flessibilità senza rendere generica l’intera classe.
Organizzerai il codice in due file:
transformer.dart: crea una classeTransformercon questi metodi generici:T getFirst<T>(List<T> items)- restituisce il primo elemento di una listaT getLast<T>(List<T> items)- restituisce l’ultimo elemento di una listaList<T> repeat<T>(T item, int times)- crea una lista contenente l’elemento ripetuto il numero di volte specificatovoid printPair<A, B>(A first, B second)- stampa due valori nel formatoPair: [first] and [second]
main.dart: importa il file del trasformatore e mostra ciascun metodo generico con tipi diversi:- Crea un’istanza di
Transformer - Usa
getFirstsu[10, 20, 30]e stampa il risultato - Usa
getFirstsu['apple', 'banana', 'cherry']e stampa il risultato - Usa
getLastsu[1.5, 2.5, 3.5]e stampa il risultato - Usa
repeatper creare una lista con'Hi'ripetuto4volte e stampa il risultato - Usa
repeatper creare una lista con7ripetuto3volte e stampa il risultato - Usa
printPaircon'Name'e42 - Usa
printPaircon100etrue
- Crea un’istanza di
Nota come ciascun metodo dichiari i propri parametri di tipo, consentendo allo stesso oggetto Transformer di lavorare con numeri interi, stringhe, numeri in virgola mobile e valori booleani, il tutto con la piena sicurezza dei tipi. Il metodo printPair mostra l’uso di due parametri di tipo in un singolo metodo.
Output previsto:
10
apple
3.5
[Hi, Hi, Hi, Hi]
[7, 7, 7]
Pair: Name and 42
Pair: 100 and trueProvalo tu
import 'transformer.dart';
void main() {
// Crea un'istanza di Transformer
var transformer = Transformer();
// TODO: Usa getFirst su [10, 20, 30] e stampa il risultato
// TODO: Usa getFirst su ['apple', 'banana', 'cherry'] e stampa il risultato
// TODO: Usa getLast su [1.5, 2.5, 3.5] e stampa il risultato
// TODO: Usa repeat per creare una lista con 'Hi' ripetuto 4 volte e stampala
// TODO: Usa repeat per creare una lista con 7 ripetuto 3 volte e stampala
// TODO: Usa printPair con 'Name' e 42
// TODO: Usa printPair con 100 e true
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniLibrerie e importazioniIntroduzione alla programmazione orientata agli oggettiClassi e oggettiLa parola chiave thisMetodiVariabili di istanzaFondamenti dei costruttoriRiepilogo - Calcolatrice semplice4Sicurezza dei valori null
Introduzione alla sicurezza dei valori nullNullable e non nullableGli operatori ? e !La keyword late e la sicurezza dei valori nullOperatori null-awareSicurezza dei valori null nelle classiRiepilogo - Sistema di profili utente7Classi astratte e interfacce
Classi astratteMetodi astrattiInterfacce in DartInterfacce impliciteImplementare vs estendereInterfacce multipleRiepilogo - Calcolatore di forme10Collezioni e generici
Panoramica di List, Set e MapCollezioni sicure rispetto ai tipiClassi genericheMetodi genericiVincoli sui genericiIterable e IteratorRiepilogo - Archiviazione generica13Concetti avanzati di OOP
Composizione vs ereditarietàMetodi di estensioneClassi chiamabiliClassi sealed (Dart 3)Record (Dart 3)Pattern e matching (3.0)Enum con metodi16Progetto: Gestione della biblioteca
Panoramica del progettoClassi Libro e Utente2I costruttori in Dart
Costruttore predefinitoCostruttori con nomeListe di inizializzazioneCostruttori costantiCostruttori factoryCostruttori di reindirizzamentoRiepilogo - Crea forme5Incapsulamento
Membri pubblici e privatiConvenzione del prefisso _Visibilità a livello di libreriaApprofondimento su getter e setterNascondimento delle informazioniRiepilogo - Registri degli studenti8Mixin
Introduzione ai MixinCreare MixinUsare più MixinParola chiave on nei MixinMixin vs ereditarietàMixin vs interfacciaRiepilogo - Sistema animale11Metodi speciali
Sovrascrittura di toString()Sovrascrittura di hashCode e ==Interfaccia ComparableMetodo call()Sovrascrittura di noSuchMethodRiepilogo - Collezione personalizzata14Modelli di progettazione Parte 1
Introduzione ai modelli di progettazioneSingletonFactoryObserverStrategy3Proprietà delle classi
Membri di istanza e staticiCampi final e constVariabili lateMetodi e campi staticiGetter e setterRiepilogo - Gestore di conti bancari6Ereditarietà
Ereditarietà di baseLa parola chiave superOverride dei metodiL’annotazione @overrideLa parola chiave final per le classiCostruttori ed ereditarietàRiepilogo - Gerarchia dei dipendenti9Polimorfismo
Fondamenti di polimorfismoPolimorfismo tramite interfacceControllo del tipo a runtimeGli operatori is e asParola chiave covariantRiepilogo - Elaboratore di pagamenti12OOP asincrona
Future e async/awaitNozioni di base sugli streamController degli streamCostruttori asincroniAsync nei metodi di classeRiepilogo - Recupero dei dati15Pattern di progettazione Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern RepositoryEsercitati da solo: Compilatore Dart online