Membri di istanza e statici
Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 17 di 110.
Nelle classi Dart, i membri (variabili e metodi) possono appartenere ai singoli oggetti oppure alla classe stessa. Comprendere questa distinzione è fondamentale per organizzare il codice in modo efficace.
I membri di istanza appartengono a ogni oggetto che crei. Ogni oggetto ha la propria copia delle variabili di istanza e i metodi di istanza operano sui dati di quello specifico oggetto:
class Dog {
String name; // Variabile di istanza
Dog(this.name);
void bark() { // Metodo di istanza
print('$name says woof!');
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
dog1.bark(); // Buddy fa bau!
dog2.bark(); // Max fa bau!Ogni oggetto Dog ha il proprio name. Cambiare il nome di un cane non influisce sull'altro.
I membri statici appartengono alla classe stessa, non a un oggetto specifico. Sono condivisi tra tutte le istanze e si accede a essi usando il nome della classe:
class Dog {
String name;
static int totalDogs = 0; // Variabile statica
Dog(this.name) {
totalDogs++;
}
}
Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');
print(Dog.totalDogs); // 2La variabile totalDogs è condivisa: ne esiste una sola copia, indipendentemente dal numero di oggetti Dog. Vi accedi tramite il nome della classe Dog.totalDogs, non tramite un'istanza.
Sfida
FacileCreiamo un sistema di conteggio dei visitatori per un museo che tiene traccia sia delle visite alle singole esposizioni sia delle statistiche complessive del museo.
Organizzerai il codice in due file:
exhibit.dart: definisci una classeExhibitche rappresenta un'esposizione museale. Ogni esposizione dovrebbe avere:- Una variabile di istanza
name(String) per il nome dell'esposizione - Una variabile di istanza
visitorCount(int) che parte da0per tenere traccia di quante persone hanno visitato questa specifica esposizione - Una variabile statica
totalVisitors(int) che parte da0per tenere traccia del totale delle visite a tutte le esposizioni - Un costruttore che accetta il nome dell'esposizione
- Un metodo
recordVisit()che incrementa siavisitorCountdell'esposizione siatotalVisitorsdella classe - Un metodo
displayStats()che stampa le informazioni sull'esposizione
- Una variabile di istanza
main.dart: importa la classe dell'esposizione e crea due esposizioni:- Un'esposizione
'Dinosaur Bones' - Un'esposizione
'Ancient Egypt'
displayStats()su ciascuna esposizione nell'ordine in cui sono state create, quindi stampa il totale dei visitatori di tutte le esposizioni.- Un'esposizione
Il metodo displayStats() dovrebbe stampare esattamente in questo formato:
[name]: [visitorCount] visitorsPer la riga con il totale dei visitatori, stampa:
Total museum visitors: [totalVisitors]Accedi alla variabile statica usando il nome della classe Exhibit.totalVisitors.
Output previsto:
Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5Provalo tu
import 'exhibit.dart';
void main() {
// TODO: Crea una mostra 'Dinosaur Bones'
// TODO: Crea una mostra 'Ancient Egypt'
// TODO: Registra 3 visite alla mostra Dinosaur Bones
// TODO: Registra 2 visite alla mostra Ancient Egypt
// TODO: Chiama displayStats() su ogni mostra, nell'ordine
// TODO: Stampa il numero totale di visitatori del museo usando Exhibit.totalVisitors
// Formato: Total museum visitors: [totalVisitors]
}
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