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.0Nota 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.78Il 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.
Sfida
FacileCreiamo 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 classePlayerche tiene traccia delle prestazioni di gioco di un giocatore. La classe dovrebbe avere:- Un campo
String nameper il nome del giocatore - Un campo privato
int _scoreche parte da0 - Un campo privato
int _livesche parte da3 - Un costruttore che accetta il nome del giocatore
- Un getter
scoreche restituisce il punteggio attuale - Un setter
scoreche accetta solo valori pari o superiori a0(ignora i valori negativi) - Un getter
livesche restituisce le vite attuali - Un setter
livesche accetta solo valori compresi tra0e5, estremi inclusi (ignora i valori al di fuori di questo intervallo) - Un getter
levelche calcola il livello del giocatore in base al punteggio: punteggio diviso per100(divisione intera), più1 - Un getter
isAliveche restituiscetruese le vite sono maggiori di0 - Un metodo
displayStatus()che stampa lo stato attuale del giocatore
- Un campo
main.dart: importa la classe del giocatore e mostra il funzionamento dei getter e setter:- Crea un giocatore chiamato
'Alex' - Imposta il punteggio su
250e chiamadisplayStatus() - Prova a impostare il punteggio su
-50(dovrebbe essere ignorato) e chiamadisplayStatus() - Imposta le vite su
1e chiamadisplayStatus() - Prova a impostare le vite su
10(dovrebbe essere ignorato) e chiamadisplayStatus()
- Crea un giocatore chiamato
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: trueProvalo 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()
}
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