this în Dart

Referință la obiectul curent, în interiorul metodelor și constructorilor unei clase.

Sintaxă
this.camp             // câmpul obiectului curent
Clasa(this.camp);     // parametru care inițializează câmpul
return this;          // întoarce obiectul curent

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. Scrie this.nume = nume sau, mai simplu, Angajat(this.nume);.
  • Folosirea lui this într-o metodă static: eroarea Invalid 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.