Ce face this
În interiorul unei metode, this este obiectul pe care a fost apelată metoda. De obicei nu trebuie scris: nume înseamnă deja this.nume. Devine necesar când un parametru sau o variabilă locală are același nume ca un câmp și îl ascunde.
În constructori, this.camp folosit ca parametru este o prescurtare: Elev(this.nume) înseamnă „primește un argument și pune-l în câmpul nume”.
this poate fi și transmis sau întors: o metodă poate da obiectul curent altei funcții sau îl poate întoarce. Nu există this în funcțiile de nivel superior, în metodele static și în lista de inițializare a unui constructor.
Exemple
Exemplul 1: Parametru cu același nume ca un câmp
În schimbaOras, oras este parametrul, iar this.oras este câmpul.
class Angajat {
String nume;
String oras;
Angajat(this.nume, this.oras);
void schimbaOras(String oras) {
print('$nume se mută din ${this.oras} în $oras.');
this.oras = oras;
}
}
void main() {
final a = Angajat('Andrei', 'Brașov');
a.schimbaOras('Sibiu');
print('Oraș nou: ${a.oras}');
}
Rezultat
Andrei se mută din Brașov în Sibiu.
Oraș nou: Sibiu
Exemplul 2: Transmiterea obiectului curent
Elevul se înscrie singur la curs, dându-se pe sine (this) metodei adauga.
class Curs {
final String titlu;
final List<Elev> inscrisi = [];
Curs(this.titlu);
void adauga(Elev e) => inscrisi.add(e);
}
class Elev {
final String nume;
Elev(this.nume);
void inscrieLa(Curs curs) {
curs.adauga(this);
print('$nume s-a înscris la ${curs.titlu}.');
}
}
void main() {
final curs = Curs('Robotică');
Elev('Ana').inscrieLa(curs);
Elev('Vlad').inscrieLa(curs);
print('Înscriși: ${curs.inscrisi.map((e) => e.nume).join(', ')}');
}
Rezultat
Ana s-a înscris la Robotică.
Vlad s-a înscris la Robotică.
Înscriși: Ana, Vlad
Exemplul 3: Metode care întorc this
Fiecare metodă întoarce obiectul, așa că apelurile se pot înlănțui.
class Comanda {
final List<String> produse = [];
double total = 0;
Comanda adauga(String produs, double pret) {
produse.add(produs);
total += pret;
return this;
}
}
void main() {
final c = Comanda().adauga('Pizza', 38).adauga('Suc', 9.5).adauga('Desert', 15);
print('${c.produse} = ${c.total} lei');
}
Rezultat
[Pizza, Suc, Desert] = 62.5 lei
Greșeli frecvente
Angajat(String nume) { nume = nume; }: parametrul se atribuie lui însuși, câmpul rămâne neinițializat. Scriethis.nume = numesau, mai simplu,Angajat(this.nume);.- Folosirea lui
thisîntr-o metodăstatic: eroareaInvalid reference to 'this' expression. - Scrierea lui
this.peste tot, fără să fie nevoie: ghidul de stil Dart o descurajează.
Comenzi înrudite
class: Definește un tip nou de obiect, cu câmpuri (date) și metode (comportament).constructori: Funcțiile speciale care creează și inițializează obiectele unei clase.cascade (..): Operatorul .. face mai multe operații pe același obiect, una după alta, fără să repeți numele lui.super: Accesează clasa părinte: constructorul ei (în lista de inițializare) sau metodele pe care subclasa le-a înlocuit.