Menu
Coddy logo textTech

Getter e setter

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 21 di 110.

I getter e i setter forniscono un modo per accedere ai campi di una classe e modificarli tramite metodi speciali che sembrano normali proprietà. Invece di esporre direttamente i campi, puoi controllare come vengono letti e scritti i valori.

Un getter è definito usando la parola chiave get e restituisce un valore calcolato o memorizzato:

class Rectangle {
  double width;
  double height;
  
  Rectangle(this.width, this.height);
  
  double get area => width * height;
  double get perimeter => 2 * (width + height);
}

Rectangle rect = Rectangle(5, 3);
print(rect.area);      // 15.0
print(rect.perimeter); // 16.0

Nota che si accede a area e perimeter come ai campi, ma vengono calcolati ogni volta. Non servono parentesi.

Un setter usa la parola chiave set e ti consente di controllare come viene assegnato un valore:

class Temperature {
  double _celsius;
  
  Temperature(this._celsius);
  
  double get celsius => _celsius;
  set celsius(double value) {
    if (value >= -273.15) {
      _celsius = value;
    }
  }
  
  double get fahrenheit => _celsius * 9 / 5 + 32;
  set fahrenheit(double value) {
    celsius = (value - 32) * 5 / 9;
  }
}

Temperature temp = Temperature(25);
print(temp.fahrenheit);  // 77.0
temp.fahrenheit = 100;
print(temp.celsius);     // 37.78

Il setter convalida l'input prima di memorizzarlo e può persino convertire tra unità di misura. Questo ti consente di controllare i tuoi dati mantenendo una sintassi pulita, simile a quella di una proprietà, per chi usa la tua classe.

challenge icon

Sfida

Facile

Creiamo un sistema di tracciamento del punteggio per un gioco che usa getter e setter per gestire le statistiche dei giocatori con convalida e valori calcolati.

Organizzerai il codice in due file:

  • player.dart: definisci una classe Player che tiene traccia delle prestazioni di gioco di un giocatore. La classe dovrebbe avere:
    • Un campo String name per il nome del giocatore
    • Un campo privato int _score che parte da 0
    • Un campo privato int _lives che parte da 3
    • Un costruttore che accetta il nome del giocatore
    • Un getter score che restituisce il punteggio attuale
    • Un setter score che accetta solo valori pari o superiori a 0 (ignora i valori negativi)
    • Un getter lives che restituisce le vite attuali
    • Un setter lives che accetta solo valori compresi tra 0 e 5, estremi inclusi (ignora i valori al di fuori di questo intervallo)
    • Un getter level che calcola il livello del giocatore in base al punteggio: punteggio diviso per 100 (divisione intera), più 1
    • Un getter isAlive che restituisce true se le vite sono maggiori di 0
    • Un metodo displayStatus() che stampa lo stato attuale del giocatore
  • main.dart: importa la classe del giocatore e mostra il funzionamento dei getter e setter:
    • Crea un giocatore chiamato 'Alex'
    • Imposta il punteggio su 250 e chiama displayStatus()
    • Prova a impostare il punteggio su -50 (dovrebbe essere ignorato) e chiama displayStatus()
    • Imposta le vite su 1 e chiama displayStatus()
    • Prova a impostare le vite su 10 (dovrebbe essere ignorato) e chiama displayStatus()

Il metodo displayStatus() dovrebbe stampare esattamente in questo formato:

[name] | Score: [score] | Level: [level] | Lives: [lives] | Alive: [isAlive]

Output previsto:

Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 3 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true
Alex | Score: 250 | Level: 3 | Lives: 1 | Alive: true

Provalo tu

import 'player.dart';

void main() {
  // TODO: Crea un jugador llamado 'Alex'

  // TODO: Establece la puntuación en 250 y llama a displayStatus()

  // TODO: Intenta establecer la puntuación en -50 (debería ignorarse) y llama a displayStatus()

  // TODO: Establece las vidas en 1 y llama a displayStatus()

  // TODO: Intenta establecer las vidas en 10 (debería ignorarse) y llama a displayStatus()
}
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Dart online